NPOI导出优于所有列,但最后变为空白

时间:2017-07-21 07:40:17

标签: c# excel npoi

我正在投资NPOI Excel导出的AutoSizeColumn()。从这个SO question,我知道在将DataTable导出为ex​​cel时,必须在调用AutoSizeColumn()之前将所有数据写入一列中。示例:(从此SO answer

HSSFWorkbook spreadsheet = new HSSFWorkbook();

DataSet results = GetSalesDataFromDatabase();

//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1");

foreach (DataColumn column in results.Tables[0].Columns)
{
    int rowIndex = 0;
    foreach (DataRow row in results.Tables[0].Rows)
    {
        HSSFRow dataRow = sheet1.CreateRow(rowIndex);
        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
        rowIndex++;
    }
    sheet1.AutoSizeColumn(column.Ordinal);
}

//Write the stream data of workbook to the file 'test.xls' in the temporary directory
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls") , FileMode.Create);
spreadsheet.Write(file);
file.Close();

当我打开test.xls时,只有最后一列有值。之前的所有专栏都没有任何内容! (但是,每个列的大小已调整。)

仅供参考:1)我使用来自https://www.dotnetperls.com/datatable的GetTable()中的代码 2)我正在使用C#。

1 个答案:

答案 0 :(得分:1)

  

当我打开test.xls时,只有最后一列有值。之前的所有专栏都没有任何内容! (但是,每列的大小都会调整。)

那是因为您正在遍历列并且(重新)在每次迭代中创建所有行。此行(重新)创建循环有效地用空白行覆盖旧行(其先前的单元格值集)。因此,所有列都是空白的。

尝试切换循环顺序,以便首先迭代行,然后迭代列:

HSSFWorkbook spreadsheet = new HSSFWorkbook();

DataSet results = GetSalesDataFromDatabase();

//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file'
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1");

int rowIndex = 0;
foreach (DataRow row in results.Tables[0].Rows)
{                
  HSSFRow dataRow = sheet1.CreateRow(rowIndex);
  foreach (DataColumn column in results.Tables[0].Columns)
  {
    dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());          
  }
  rowIndex++;
}

for(var i = 0; i< results.Tables[0].Columns.Count; i++)
{
  sheet1.AutoSizeColumn(i);
}

//Write the stream data of workbook to the file 'test.xls' in the temporary directory
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls"), FileMode.Create);
spreadsheet.Write(file);
file.Close();