【问题标题】:EPPlus - LoadFromCollection - Text converted to numberEPPlus - LoadFromCollection - 文本转换为数字
【发布时间】:2015-09-15 13:48:30
【问题描述】:

我正在用 C# 编写一个程序,需要将 List<MyObject> 导出到 Excel 中,我正在使用 EPPlus 来执行此操作。

我的挑战是我的对象有一个属性:

string Prop1 { get; set; }

而且,我需要导出的值之一有一个值,例如,Prop1 = "123E4" 的形式。

挑战在于 EPPlus LoadFromCollection 方法将其导出到 Excel,但 Excel 使用科学计数法将其转换为数字(输出值 = 1.23E+061230000)。

我尝试将整个列设置为.Style.Numberformat.Format = "@"(以及我能想到的任何其他样式),我什至尝试在调用LoadFromCollection 方法之前和之后设置样式。

我还尝试在字符串前面加上 ' 字符,但这实际上将该字符保留在该列中的每个单元格中,从而使值不适合分析。

我正在尝试将我的 List 转换为 DataTable 以便使用 LoadFromDataTable 方法,但即使这样似乎也不起作用。

关于如何将其导出为纯文本的任何想法/建议

【问题讨论】:

    标签: c# .net excel formatting epplus


    【解决方案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();
        }
    }
    

    【讨论】:

    • 非常感谢您的建议,厄尼——不过,我的挑战不是这样。是Excel实际上将"123E4"等字符串转换为数字1230000。可悲的是,禁用警告并不能阻止转换的发生:/
    • @JohnBus​​tos 我明白你现在的意思了。当您运行上述测试方法时会发生什么(我将其更改为使用LoadFromCollection)?它做同样的事情吗?对我来说,它不会转换为数字 - 如果 xml mod 没有完成,它只会显示绿色三角形。
    • Ernie,感谢您的更新,不幸的是,它仍然将字符串转换为数字。我使用 List 而您使用的是数据表,但即使我尝试使用我的数据,我也会发生转换......这令人讨厌......
    • Ernie,我深表歉意,在一遍又一遍地审查这一点时,我发现我的数据是以科学计数法数字而不是字符串的形式从 SQL Server 返回的(为什么,我不'不知道!!),但这不是一个epplus问题......我很抱歉,但我很感激你的回答,因为它非常有帮助和有用,只是没有机会真正解决我的具体问题......很抱歉,但是当您做对了所有事情时,我肯定会将您标记为答案!!!谢谢!!!!
    • @JohnBus​​tos 哈哈,没什么大不了的。我们都去过那儿。至少你已经找到了问题的根源。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多