C#使用excel文件

时间:2016-12-07 08:29:59

标签: c# .net excel datagridview npoi

从dataGridView保存更改后,当通过excel打开xlsx文件时,会发生以下错误:

  

我们发现Book1.xlsx'中的某些内容存在问题。你想让我们尽可能多地恢复吗?如果您信任此工作簿的来源,请单击“是”。

for (int i = 0; i < dataGridView1.RowCount - 1; i++)
        {
            if (sh.GetRow(i) == null)
                sh.CreateRow(i);

            for (int j = 0; j < dataGridView1.ColumnCount; j++)
            {
                if (sh.GetRow(i).GetCell(j) == null)
                    sh.GetRow(i).CreateCell(j);

                if (dataGridView1[j, i].Value != null)
                {
                    sh.GetRow(i).GetCell(j).SetCellValue(dataGridView1[j, i].Value.ToString());
                }
                using (var fs = new FileStream("Book1.xlsx", FileMode.Open, FileAccess.ReadWrite))
                {
                    wb.Write(fs);
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

首先,您要多次编写工作簿,每个单元格一次。在完成更改后,您最后应该只编写一次工作簿。

此外,您的问题不清楚如何创建工作簿或工作表。我在下面添加了一些代码,以明确它应该如何。

试试这样:

XSSFWorkbook wb = new XSSFWorkbook();
ISheet sheet = wb.GetSheet("Sheet1") ?? wb.CreateSheet("Sheet1");

for (int i = 0; i < dataGridView1.RowCount; i++)
{
    IRow row = sheet.GetRow(i) ?? sh.CreateRow(i);

    for (int j = 0; j < dataGridView1.ColumnCount; j++)
    {
        ICell cell = row.GetCell(j) ?? row.CreateCell(j);

        if (dataGridView1[j, i].Value != null)
        {
            cell.SetCellValue(dataGridView1[j, i].Value.ToString());
        }
    }
}

using (var fs = new FileStream("Book1.xlsx", FileMode.Create, FileAccess.Write))
{
    wb.Write(fs);
}