9

我正在尝试使用 NPOI 将一些内容写入 excel 文件。但是在使用自动调整列大小的方法时会导致错误“参数无效”。这只发生在具有大量数据的工作表中。下面是我用来完成这项工作的代码。

public void CloseDatabaseLogFile()
{
    try
    {
        FileStream sw = File.Create(excelSheetPath);

        oSheet.AutoSizeColumn(0);
        oSheet.SetColumnWidth(1, 8400);

        oSheet.AutoSizeColumn(2);
        oSheet.AutoSizeColumn(3);
        oSheet.AutoSizeColumn(4);
        oSheet.AutoSizeColumn(5);
        oSheet.AutoSizeColumn(6);
        oSheet.AutoSizeColumn(7);
        oSheet.AutoSizeColumn(8);
        oSheet.AutoSizeColumn(9);
        oSheet.AutoSizeColumn(10);

        workbook.Write(sw);
        sw.Close();
    }
    catch (Exception e)
    {
        throw e;
    }
}
4

2 回答 2

5

您可以在 AutoSize 调用之间使用GC.Collect()( Garbage Collector )解决此问题。这不是最好的解决方案,但似乎 NPOI (2.0.1) 没有处理 AutoSize 功能所需的位图对象。

在大型 Excel 文件中自动调整 10 列时,我在这里遇到了同样的问题。请参阅下面的固定代码:

int numberOfColumns = sheet.GetRow(rowOffSet).PhysicalNumberOfCells;
for (int i = 1; i <= numberOfColumns; i++)
{
    sheet.AutoSizeColumn(i);
    GC.Collect(); // Add this line
}

没有GC.Collect(),我有以下错误:

System.ArgumentException: Parameter is not valid.
   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
   at NPOI.SS.Util.SheetUtil.GetCellWidth(ICell cell, Int32 defaultCharWidth, DataFormatter formatter, Boolean useMergedCells)
   at NPOI.SS.Util.SheetUtil.GetColumnWidth(ISheet sheet, Int32 column, Boolean useMergedCells)
   at NPOI.XSSF.UserModel.XSSFSheet.AutoSizeColumn(Int32 column, Boolean useMergedCells)
于 2014-08-27T14:23:05.930 回答
1

有两种解决方案:1。

for (int i = 0; i < columnNames.Count; i++)
{
    sheet.AutoSizeColumn(i);
}

2.

for (int i = 0; i < columnNames.Count; i++)
{
    sheet.SetColumnWidth(i, (columns[columnNames[i]].ToString().Length) * 2 * 256);
}
于 2019-04-30T06:59:15.437 回答