那绝对是有问题的。我自己也能够复现它。它与你创建的表格有关。如果你打开文件并使用“表格工具”选项卡中的“转换为范围”选项将其删除,问题就会消失。
我查看了源代码,并提取了zip级别的xml文件,没有看到任何迹象表明它实际上正在干扰它们——似乎是一个直接的复制。
非常奇怪,因为如果我们从EPPlus创建和保存包括表格的xlsx文件,问题就不会存在。这样做完全没有问题:
[TestMethod]
public void Template_Copy_Test()
{
const string templatePath = "c:\\temp\\testtemplate.xlsx";
const string resultPath = "c:\\temp\\result.xlsx";
var dtdata = new DataTable("tblData");
dtdata.Columns.Add(new DataColumn("Col1", typeof(string)));
dtdata.Columns.Add(new DataColumn("Col2", typeof(int)));
dtdata.Columns.Add(new DataColumn("Col3", typeof(int)));
for (var i = 0; i < 20; i++)
{
var row = dtdata.NewRow();
row["Col1"] = "String Data " + i;
row["Col2"] = i * 10;
row["Col3"] = i * 100;
dtdata.Rows.Add(row);
}
var templateFile = new FileInfo(templatePath);
if (templateFile.Exists)
templateFile.Delete();
using (var pck = new ExcelPackage(templateFile))
{
var ws = pck.Workbook.Worksheets.Add("Data");
ws.Cells["A1"].LoadFromDataTable(dtdata, true);
for (var i = 2; i <= dtdata.Rows.Count + 1; i++)
ws.Cells[i, 4].Formula = String.Format("{0}*{1}", ExcelCellBase.GetAddress(i, 2), ExcelCellBase.GetAddress(i, 3));
ws.Tables.Add(ws.Cells[1, 1, dtdata.Rows.Count + 1, 4], "TestTable");
pck.Save();
}
using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile))
{
pck.Save();
}
}
但是......
如果我们打开testtemplate.xlsx
,删除表格,保存/关闭文件,重新打开并插入完全相同的表格,则在运行此操作时会出现问题:
[TestMethod]
public void Template_Copy_Test2()
{
const string templatePath = "c:\\temp\\testtemplate.xlsx";
const string resultPath = "c:\\temp\\result.xlsx";
var templateFile = new FileInfo(templatePath);
using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile))
{
pck.Save();
}
}
我想可能是他们的压缩复制方法中有一些问题,但我没有发现明显的错误。
不过至少你可以尝试解决这个问题。
Ernie