EPPlus - LoadFromCollection - 文本转换为数字
EPPlus - LoadFromCollection - Text converted to number
我正在用 C# 编写一个需要将 List<MyObject>
导出到 Excel 的程序,我正在使用 EPPlus 进行此操作。
我的挑战是我的对象有一个 属性:
string Prop1 { get; set; }
并且,我需要导出的值之一具有例如 Prop1 = "123E4"
.
形式的值
挑战在于 EPPlus LoadFromCollection
方法将其导出到 Excel,但 Excel 使用科学记数法将其转换为数字(输出值 = 1.23E+06
或1230000
).
我尝试将整个列设置为 .Style.Numberformat.Format = "@"
(以及我能想到的任何其他样式),我什至尝试在调用 LoadFromCollection
方法之前和之后设置样式.
我还尝试在字符串前面加上一个 '
字符,但这实际上将该字符保留在该列的每个单元格中,从而使值不正确以供分析。
我正在尝试将我的 List 转换为 DataTable 以便使用 LoadFromDataTable
方法,但即便如此似乎也不起作用。
关于如何将其导出为纯文本的任何想法/建议
如果您有看起来像数字的字符串,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();
}
}
我正在用 C# 编写一个需要将 List<MyObject>
导出到 Excel 的程序,我正在使用 EPPlus 进行此操作。
我的挑战是我的对象有一个 属性:
string Prop1 { get; set; }
并且,我需要导出的值之一具有例如 Prop1 = "123E4"
.
挑战在于 EPPlus LoadFromCollection
方法将其导出到 Excel,但 Excel 使用科学记数法将其转换为数字(输出值 = 1.23E+06
或1230000
).
我尝试将整个列设置为 .Style.Numberformat.Format = "@"
(以及我能想到的任何其他样式),我什至尝试在调用 LoadFromCollection
方法之前和之后设置样式.
我还尝试在字符串前面加上一个 '
字符,但这实际上将该字符保留在该列的每个单元格中,从而使值不正确以供分析。
我正在尝试将我的 List 转换为 DataTable 以便使用 LoadFromDataTable
方法,但即便如此似乎也不起作用。
关于如何将其导出为纯文本的任何想法/建议
如果您有看起来像数字的字符串,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();
}
}