我正在编写一个程序来处理一些excel文档,该程序是用Visual Studio 2010中的C#编写的,我使用的是NPOI库。
我注意到我无法将CloneSheet()
用于 xlsm 文件,但我可以使用xlsx进行此操作。
CloneSheet()
是我真正需要的一个函数,所以我真的想让它工作而不是逐个单元格复制所有内容。
我想过将文件转换为xlsx。我能够手动完成,但不能以编程方式完成。
这是我写的尝试这样做的代码:
XSSFWorkbook workbook;
//read original xlsm file into workbook
using (FileStream file = new FileStream(@"OriginalFile\" + filename, FileMode.Open, FileAccess.Read))
{ workbook = new XSSFWorkbook(file); }
//change file extension to xlsx and save in a new location
filename = Path.ChangeExtension(filename, "xlsx");
if (!Directory.Exists("NewFile"))
Directory.CreateDirectory("NewFile");
FileStream stream = new FileStream(("NewFile\\New" + filename), FileMode.Create, System.IO.FileAccess.Write);
workbook.Write(stream);
stream.Close();
//read the newly created file from the new location
using (FileStream file = new FileStream(@"NewFile\\New" + filename, FileMode.Open, FileAccess.Read))
{ workbook = new XSSFWorkbook(file); }
上面的代码将创建新的xlsx文件,但该文件无法打开并且似乎已损坏...
我已经谷歌搜索了一段时间,似乎无法找到解决方案,任何人都可以帮助或指出我正确的方向吗?
- EDIT ---
我尝试使用Open XML找到here的另一种方法,但我遇到了同样的问题,即创建文件但我无法打开文件。
但是,该文件似乎没有损坏。我正在读取文件的程序读取数据没有问题,当我尝试在excel中打开文件时,它说" 该文件是一个无宏文件,但包含宏 - 启用内容。"
似乎我越来越近了,但我需要能够打开输出文件,否则它没用......
答案 0 :(得分:0)
您可能需要滚动自己的方法:迭代行然后迭代单元格。这篇文章Copy Row Helper让我开始了。您必须将其修改为使用两个工作簿。此方法将复制数据和公式。必须重新创建CellStyles,因为它们特定于原始工作簿。