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

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

  1. 添加到不存在的文件(效果很好)。
  2. 添加到现有的文件(不工作:它不会产生NEWlogging,只显示从“其他”身体的旧logging)。

这是我的代码:

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

什么是错的,我应该在代码中改变什么?

我采取@畏惧的例子,并采取了一步,我有一个扩展方法来处理这一点。

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

我从我的一个项目中插入一个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; 

自从我写这篇文章以来,我已经有一段时间了,但据我所知,这个想法是,创build一个覆盖将被填充的行和列的范围。 Cell对象有一个可以接受任何IEnumerable源的InsertData方法。

你可能不需要ws.Range行,我插入到模板中,所以我必须先创build空间。

要添加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();