我一直在努力提高写入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.Number); //cell.CellValue = new CellValue(row[col].ToString()); cell.Append(v); } else if (objDataType.Contains(TypeCode.Decimal.ToString()) || objDataType.Contains("Single")) { cell.DataType = new EnumValue (CellValues.Number); cell.Append(v); //TODO: set the decimal qualifier - May be fixed elsewhere cell.StyleIndex = 2; } else { //Add text to text cell cell.DataType = new EnumValue (CellValues.String); cell.Append(v); } } if (colStyles != null && col < colStyles.Count) { cell.StyleIndex = (UInt32Value)colStyles[col]; } //writer.WriteElement(cell); xlr.Append(cell); } writer.WriteElement(xlr); //end row element //writer.WriteEndElement(); ++rowCnt; }
这段代码非常接近我在那里看到的例子.但问题是它仍然很慢.从单个单元格写入更改为追加到行并写入行似乎在125K行上将过程改进了10%.
有没有人找到一种方法来改进作者或设置一种写入次数较少的方法?有没有方法可以加快这个过程?
有没有人试图设置某种形式的缓存来提高性能?