Экспорт результатов LinqPAD в файл Excel без метаданных количества строк

Я пытался записать в файл excel только набор результатов из запроса, но я продолжаю получать столбец заголовка с количеством строк, что мешает последующей обработке данных, которую мне нужно выполнить. Я мог бы войти в экспортированный файл и удалить первую строку, но было бы намного лучше, если бы я мог экспортировать набор данных без строки заголовка.

Вот мой хак, интересно, есть ли у кого-нибудь лучший способ сделать это. Я беру сгенерированный html и использую регулярное выражение для извлечения строки заголовка:

public string DumpToHtmlString<T>(T objectToSerialize, string filePath )
    {
        string strHTML = "", outpuWithoutHeader ="";
        try
        {
            var writer = LINQPad.Util.CreateXhtmlWriter(true);
            writer.Write(objectToSerialize);
            strHTML = writer.ToString();
            outpuWithoutHeader = Regex.Replace(strHTML, "<tr><td class=\"typeheader\"((\\s*?.*?)*?)<\\/(tr|TR)>", "", RegexOptions.Multiline);
            System.IO.File.WriteAllText(filePath, outpuWithoutHeader );

        }
        catch (Exception exc)
        {
            Debug.Assert(false, "Investigate why ?" + exc);
        }
        return outpuWithoutHeader;
    }

person BraveNewMath    schedule 02.03.2013    source источник


Ответы (1)


Является ли objectToSerialize IEnumerable? Если да, то в бета-версии LINQPad есть метод WriteCsv, предназначенный для создания CSV-файлов, удобных для Excel:

Util.WriteCsv(data, @"c:\temp\results.csv");

В противном случае безопаснее использовать LINQ-to-XML DOM для изменения вывода, а не регулярное выражение. В следующем коде показано, как удалить форматирование из вывода LINQPad. вы также можете адаптировать его для удаления заголовков и итогов:

XDocument doc = XDocument.Load (...);
XNamespace xns = "http://www.w3.org/1999/xhtml";

doc.Descendants (xns + "script").Remove ();
doc.Descendants (xns + "span").Where (el => (string)el.Attribute ("class") == "typeglyph").Remove ();

doc.Descendants ().Attributes ("style").Where (a => (string)a == "display:none").Remove ();

doc.Descendants (xns + "style").Remove ();
doc.Descendants (xns + "tr").Where (tr => tr.Elements ().Any (td => (string)td.Attribute ("class") == "typeheader")).Remove ();
doc.Descendants (xns + "i").Where (e => e.Value == "null").Remove ();

foreach (XElement anchor in doc.Descendants (xns + "a").ToArray ())
    anchor.ReplaceWith (anchor.Nodes ());

var presenters = doc.Descendants (xns + "table")
    .Where (el => (string)el.Attribute ("class") == "headingpresenter")
    .Where (e => e.Elements ().Count () == 2)
    .ToArray ();

foreach (var p in presenters)
{
    var heading = p.Elements ().First ().Elements ();
    var content = p.Elements ().Skip (1).First ().Elements ();

    if (stripFormatting)
        p.ReplaceWith (heading, new XElement (xns + "p", content));
    else
        p.ReplaceWith (
            new XElement (xns + "br"),
            new XElement (xns + "span", new XAttribute ("style", "color: green; font-weight:bold; font-size: 110%;"), heading),
            content);
}

// Excel centre-aligns th even if the style says otherwise. So we replace them with td elements.
foreach (var th in doc.Descendants (xns + "th"))
{
    th.Name = xns + "td";
    if (!stripFormatting && th.Attribute ("style") == null)
        th.Add (new XAttribute ("style", "font-weight: bold; background-color: #ddd;"));
}

string finalResult = doc.ToString().Replace ("Ξ", "").Replace ("▪", "");
person Joe Albahari    schedule 02.03.2013
comment
Если все, что вам нужно сделать, это подавить сводные итоги в нижней части вывода дампа, простой хак — добавить .ToString() к числовым типам членов. Тогда Dump() не будет отображать итоговую строку с итоговыми значениями. например Если все, что вам нужно сделать, это подавить сводные итоги в нижней части вывода дампа, простой хак — добавить .ToString() к числовым типам членов. Тогда Dump() не будет отображать итоговую строку с итоговыми значениями. например var n = новый []{1,2,3}; n.Select(x => x.ToString()).Dump(); - person Andrew Dennison; 21.02.2019