EPPlus — LoadFromCollection — текст, преобразованный в число

Я пишу программу на C#, которой необходимо экспортировать List<MyObject> в Excel, и для этого я использую EPPlus. .

Моя проблема заключается в том, что мой объект имеет свойство:

string Prop1 { get; set; }

И одно из значений, которое мне нужно экспортировать, имеет значение, например, в форме Prop1 = "123E4".

Проблема заключается в том, что метод EPPlus LoadFromCollection экспортирует это в Excel, но Excel преобразует его в число, используя экспоненциальную запись (выходное значение = 1.23E+06 или 1230000).

Я пытался установить для всего столбца значение .Style.Numberformat.Format = "@" (и любой другой стиль, который только мог придумать), и я даже пытался установить стиль до и после вызова метода LoadFromCollection.

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

Я играю с преобразованием моего списка в DataTable, чтобы использовать метод LoadFromDataTable, но даже это, похоже, не работает.

Любые идеи/предложения о том, как я могу экспортировать это как чистый текст


person John Bustos    schedule 15.09.2015    source источник


Ответы (1)


Если у вас есть строки, похожие на числа, Excel предупредит вас зелеными треугольниками в углах ячеек. Это предполагает, что вы конвертируете числа (если они числа) в строку, используя что-то вроде .ToString(). В Excel нет способа обойти это, но вы можете включить предупреждающее сообщение об отключении для этого условия, используя манипуляции с XML, поскольку EPPlus изначально не имеет такой возможности.

Что-то вроде этого сделает это:

public class TestObject
{
    public int Col1 { get; set; }
    public int Col2 { get; set; }
    public string Col3 { get; set; }
}

[TestMethod]
public void Number_String_Test()
{
    //Throw in some data
    var datalist = new List<TestObject>();

    for (var i = 0; i < 10; i++)
    {
        datalist.Add(new TestObject
        {
            Col1 = i,
            Col2 = i *10,
            Col3 = (i*10) + "E4"
        });
    }

    //Create a test file
    var fi = new FileInfo(@"c:\temp\numtest.xlsx");
    if (fi.Exists)
        fi.Delete();

    using (var pck = new ExcelPackage(fi))
    {
        var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
        worksheet.Cells.LoadFromCollection(datalist);

        //This would be the variable drawn from the desired cell range
        var range = "C1:C11";

        //Get reference to the worksheet xml for proper namspace
        var xdoc = worksheet.WorksheetXml;

        //Create the import nodes (note the plural vs singular
        var ignoredErrors = xdoc.CreateNode(XmlNodeType.Element, "ignoredErrors", xdoc.DocumentElement.NamespaceURI);
        var ignoredError = xdoc.CreateNode(XmlNodeType.Element, "ignoredError", xdoc.DocumentElement.NamespaceURI);
        ignoredErrors.AppendChild(ignoredError);

        //Attributes for the INNER node
        var sqrefAtt = xdoc.CreateAttribute("sqref");
        sqrefAtt.Value = range;

        var flagAtt = xdoc.CreateAttribute("numberStoredAsText");
        flagAtt.Value = "1";

        ignoredError.Attributes.Append(sqrefAtt);
        ignoredError.Attributes.Append(flagAtt);

        //Now put the OUTER node into the worksheet xml
        xdoc.LastChild.AppendChild(ignoredErrors);

        pck.Save();
    }
}
person Ernie S    schedule 15.09.2015
comment
Большое спасибо за предложение, Эрни. Но моя задача не в этом. Дело в том, что Excel фактически преобразует строку, такую ​​как "123E4", в число 1230000. К сожалению, отключение предупреждения не останавливает преобразование:/ - person John Bustos; 15.09.2015
comment
@JohnBustos Теперь я понимаю, что ты имеешь в виду. Что происходит, когда вы запускаете вышеуказанный метод тестирования (я изменил его, чтобы использовать LoadFromCollection)? Он делает то же самое? У меня он не конвертирует в число - просто показывает зеленые треугольники, если мод xml не сделан. - person Ernie S; 15.09.2015
comment
Эрни, спасибо за обновление, к сожалению, оно по-прежнему преобразует строку в число. Я использую List‹MyObject›, в то время как вы используете таблицу данных, но даже когда я пытаюсь использовать ваши данные, я получаю преобразование... Это раздражающе расстраивает..... - person John Bustos; 16.09.2015
comment
Эрни, мои ГЛУБОКИЕ извинения, просматривая это снова и снова, я обнаружил, что мои данные возвращаются из SQL Server в виде числа в экспоненциальном представлении, а не в виде строки (почему, я не знаю!!), но это не было проблемой epplus... Мне очень жаль, но я благодарен за ваш ответ, так как он был ОЧЕНЬ полезным и полезным, просто не было никаких шансов решить мою конкретную проблему... ТАК извините, но я обязательно отметить вас как ответ, так как вы все сделали правильно!!! СПАСИБО!!!! - person John Bustos; 16.09.2015
comment
@JohnBustos LOL, ничего страшного. Мы все были там. По крайней мере, вы докопались до корня проблемы. Удачи! - person Ernie S; 16.09.2015
comment
Еще раз спасибо ОГРОМНОЕ, Эрни!! - person John Bustos; 17.09.2015