C# 使用 excel 文件

C# Working with excel file

从 dataGridView 保存更改后,通过 excel 打开 xlsx 文件时出现此错误:

We found a problem with some content in 'Book1.xlsx' Do you want us to recover as much as we can? If you trust the source of this workbook, click Yes.

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);
                }
            }
        }

一方面,您要多次编写工作簿,每个单元格一次。你真的应该只写一次工作簿,最后,当你完成更改时。

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

这样试试:

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);
}