如何使用C#和ClosedXML将新行附加到Excel文件?

时间:2015-03-21 18:03:59

标签: c# excel closedxml

我应该在现有的Excel文件中附加一个新行。该任务由两部分组成:

  1. 添加到不存在的文件(效果很好)。
  2. 添加到现有文件(不起作用:它不会创建新记录,仅显示来自&#34的旧记录;否则"正文)。
  3. 这是我的代码:

    private static void ExportToEXCEL(DataTable dt, string paymentStoryPath)
    {
        if (File.Exists(paymentStoryPath))
        {
            XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
            IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
            //IXLCell cellForNewData = index.Cell(index.LastRowUsed().RowNumber() + 1, 1);
            IXLRow rowForNewData = currentWsh.Row(currentWsh.LastRowUsed().RowNumber()+1);
            rowForNewData.InsertRowsBelow(1);
            rowForNewData.Value = dt;
            currentWorkbook.Save();
        }
        else
        {
            //not exist
            XLWorkbook wb = new XLWorkbook();
            wb.Worksheets.Add(dt, "Payment history");
            wb.SaveAs(paymentStoryPath);
        }
    }
    

    有什么问题,我的代码应该改变什么?

3 个答案:

答案 0 :(得分:4)

要添加DataTable,请使用InsertTable()方法:

    XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
    IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
    IXLCell cellForNewData = currentWsh.Cell(currentWsh.LastRowUsed().RowNumber() + 1, 1);
    cellForNewData.InsertTable(dt);
    currentWorkbook.Save();

答案 1 :(得分:4)

我从我的一个将DataTable插入Excel的项目中获得了以下代码。

//insert rows below a range from the cell going table rows down
ws.Range(
    cell.Address.RowNumber
    , cell.Address.ColumnNumber
    , cell.Address.RowNumber + DocDataSet.Tables[tableNo].Rows.Count
    , cell.Address.ColumnNumber)
    .InsertRowsBelow(DocDataSet.Tables[tableNo].Rows.Count);

//InsertData returns a range covering the inserted data
var ra = ws.Cell(cell.Address.RowNumber, cell.Address.ColumnNumber)
    .InsertData(DocDataSet.Tables[tableNo].AsEnumerable());

//apply the style of the table token cell to the whole range
ra.Style = cell.Style;

自从我编写它以来已经有一段时间了,但据我所知,创建一个范围将覆盖将填充的行和列。 Cell对象具有InsertData方法,可以使用任何IEnumerable来源。

您可能不需要ws.Range行,我正在插入模板,所以我必须先创建空间。

答案 2 :(得分:-1)

我拿了@raidri的例子,然后又向前迈了一步,我有一个扩展方法来处理这个问题。

public static class Extensions
{
    public static void ToExcelFile(this DataTable dataTable, string filename, string worksheetName = "Sheet1")
    {
        using(var workbook = new XLWorkbook())
        {
            workbook.Worksheets.Add(dataTable, worksheetName);

            workbook.SaveAs(filename);
        }
    }
}

使用

myDataTable.ToExcelFile(@"C:\temp\myFile.xlsx");