在EPPlus C#中展开一个表格
有什么方法可以在C#中扩展EPPlus中的现有表。 我的程序工作的方式是创build只有2行的表,并不断添加更多。 我似乎无法在ExcelTable
find任何resize的方法。 有没有一个专门的方法,或者我需要使用某种替代?
编辑:好吧,我只是要澄清这一点。 我已经有EPPLus的工作,并build立一个ExcelTable。 我的问题是:如何使现有的ExcelTable更大(添加更多的行)?
不幸的是,没有直接的方法。 不太清楚为什么,但EPPlus的开发人员select只准备ExcelTable.Address
属性。 所以最明显的select是创build一个新表,复制所有的属性(假设你知道所有需要的)并删除旧的。 不是很理想,因为你可能会错过什么。
但是我看到另外两个其他的 – 下一个非常好,但更好的复制/删除。 假设一个表如下所示:
选项1你可以分叉EPPlus源代码,并使属性需要读/写。 你可以在ExcelTable.cs
文件中通过改变:
public ExcelAddressBase Address { get { return _address; } internal set //REMOVE internal KEYWORD { _address = value; SetXmlNodeString("@ref",value.Address); WriteAutoFilter(ShowTotal); } }
通过删除internal
关键字。 但是,当然,你必须小心,这样做不会破坏别的东西。 有了这个,你可以做这样的事情:
var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx"); using (var pck = new ExcelPackage(fileInfo)) { var workbook = pck.Workbook; var worksheet = workbook.Worksheets.First(); //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows) worksheet.Cells["A12"].Value = 10; worksheet.Cells["B12"].Value = 100; worksheet.Cells["C12"].Value = Path.GetRandomFileName(); var tbl = worksheet.Tables["TestTable1"]; var oldaddy = tbl.Address; var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column); tbl.Address = newaddy; pck.Save(); }
选项2将是更安全的选项,但通过在XML上使用stringreplace,大多数是“脏”的。 我们不能假设只有一个引用的地址,因为,例如,自动筛选可以打开。 以下是在Excel中创build表格时默认的XML的样子(注意地址的2个引用):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="3" name="TestTable1" displayName="TestTable1" ref="A1:C11" totalsRowShown="0"> <autoFilter ref="A1:C11" /> <tableColumns count="3"> <tableColumn id="1" name="Col1" /> <tableColumn id="2" name="Col2" /> <tableColumn id="3" name="Col3" /> </tableColumns> <tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0" /> </table>
所以我们可以像这样做一个stringreplace:
var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx"); using (var pck = new ExcelPackage(fileInfo)) { var workbook = pck.Workbook; var worksheet = workbook.Worksheets.First(); //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows) worksheet.Cells["A12"].Value = 10; worksheet.Cells["B12"].Value = 100; worksheet.Cells["C12"].Value = Path.GetRandomFileName(); var tbl = worksheet.Tables["TestTable1"]; var oldaddy = tbl.Address; var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column); //Edit the raw XML by searching for all references to the old address tbl.TableXml.InnerXml = tbl.TableXml.InnerXml.Replace(oldaddy.ToString(), newaddy.ToString()); pck.Save(); }
这个问题大约一岁,但希望有人仍然需要一个答案,有一个直接的解决scheme,虽然没有完成,因为在EEPlus(我正在使用v4.1)的错误。
ExcelWorksheet有一个InsertRow(Int32,Int32,Int32)方法。 如果在作为表格一部分的区域中插入行,表格也会展开。 只需使用它的Address属性即可获得界限。 只要确保在表格的第一行和最后一行之间插入即可。
我知道有一个与单元validation相关的缺陷:即使使用可以从现有行复制样式的重载,也不会复制validation。 更糟糕的是,validation是留在原来的位置,并且不随细胞移动。 我还没有testing,但我相信,如果validation有一个范围,而不是一个单元格作为目标,那么也扩大了,如果你插入行的范围。
如果您希望展开工作表中的数据表,这将无济于事,但您仍然可以移动行。 而且,当你有许多桌子并肩(这是一场噩梦)。
您需要导入OpenOffice包然后创build新的包。 然后创build新的工作表对象来存储数据表的所有数据,如下面的代码。
using (ExcelPackage pck = new ExcelPackage(newFile)) { ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts"); ws.Cells["A1"].LoadFromDataTable(dataTable, true); pck.Save(); }
您可以使用MVC中的FileResult导出Excelpackage。
您需要将现有的Excel电子表格读入内存,然后才能操作它,并保存生成的文件:
var path = @"C:\file.xlsx"; var file = File.ReadAllBytes(path); var ms = new MemoryStream(file); using (var package = new ExcelPackage(ms)) { var ws = package.Workbook.First(); // get index of last row var lastRow = ws.Dimension.End.Row; // add a new row at the end ws.Cells(lastRow + 1, 1).Value = "new row"; var bytes = package.GetAsByteArray(); File.WriteAllBytes(path, bytes); }