我正在用C#编写一个需要导出List<MyObject>到Excel的程序,我正在使用EPPlus这样做.
我的挑战是我的对象有一个属性:
string Prop1 { get; set; }
Run Code Online (Sandbox Code Playgroud)
并且,我需要导出的值之一具有一个值,例如,其形式为Prop1 = "123E4".
挑战在于EPPlus LoadFromCollection方法将其导出到Excel,但Excel使用科学记数法(Outputted value = 1.23E+06或1230000)将其转换为数字.
我已经尝试将整个列设置为.Style.Numberformat.Format = "@"(以及我能想到的任何其他样式),我甚至尝试在LoadFromCollection调用方法之前和之后设置样式.
我也尝试在字符串前面添加一个'字符,但实际上该字符在该列中的每个单元格中保留,然后使得值不正确以进行分析.
我正在玩我的List转换为DataTable以便使用该LoadFromDataTable方法,但即使这似乎不起作用.
关于如何将其导出为纯文本的任何想法/建议
我一直在努力提高写入xlsx的SAX方法的性能.我知道Excel中有1048576行的限制.我只打了几次这个限制.在大多数情况下,虽然我只写出大约125K到250K行(一个大数据集).我尝试过的代码似乎没有那么快,因为它会多次写入文件.我希望有一些缓存,但似乎现在代码工作的方式有太多的磁盘访问.
下面的代码类似于使用OpenXML和SAX模板,因为我使用ClosedXML写入文件,然后切换到SAX以获取大内容.尝试对这么多行使用ClosedXML时,内存会脱离图表.这就是我使用SAX的原因.
int numCols = dt.Columns.Count;
int rowCnt = 0;
//for (curRec = 0; curRec < totalRecs; curRec++)
foreach (DataRow row in dt.Rows)
{
Row xlr = new Row();
//starting of new row.
//writer.WriteStartElement(xlr);
for (int col = 0; col < numCols; ++col)
{
Cell cell = new Cell();
CellValue v = new CellValue(row[col].ToString());
{
string objDataType = row[col].GetType().ToString();
if (objDataType.Contains(TypeCode.Int32.ToString()) || objDataType.Contains(TypeCode.Int64.ToString()))
{
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
//cell.CellValue = new CellValue(row[col].ToString());
cell.Append(v);
}
else if (objDataType.Contains(TypeCode.Decimal.ToString()) || …Run Code Online (Sandbox Code Playgroud)