我有一个Excel 2007电子表格,使用OpenXML SDK 2进行编辑。我删除了一些行等。我想知道如何将该Spreadsheetdocument保存到另一个文件名。
我有一个Excel 2007电子表格,使用OpenXML SDK 2进行编辑。我删除了一些行等。我想知道如何将该Spreadsheetdocument保存到另一个文件名。
byte[] byteArray = File.ReadAllBytes("C:\\temp\\oldName.xltx");
using (MemoryStream stream = new MemoryStream())
{
stream.Write(byteArray, 0, (int)byteArray.Length);
using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
{
// Do work here
}
File.WriteAllBytes("C:\\temp\\newName.xlsx", stream.ToArray());
}
还有其他的方式来更改名称,比如在将文件返回给ASP.NET MVC Web应用程序用户时,但这取决于你要做什么。
看看这个基于 OpenXML 的库ClosedXML,它简化了很多文档操作并提供了 SaveAs 方法。下面是一个示例:
var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");
我强烈推荐使用ClosedXML - 我第一次使用它并最初在几小时内完成了“从Excel导入”功能,使用标准的Open XML 2.0 SDK - 现在我只需要不到15分钟就可以重新编写它,并且使用此工具仅需10分钟即可完成Excel导出。
string sourceFile = "C:\Users\***.xlsx";
string destFile = "C:\Users\*****.xlsx";
System.IO.File.Copy(sourceFile, destFile, true);
using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(destFile, true))
{
//remove some rows etc
//save workbookpart
}
/// <summary>
/// Saves as.
/// </summary>
/// <param name="fileName">Name of the file.</param>
public void SaveAs(String filename)
{
String dir = filename.Replace(System.IO.Path.GetFileName(filename), String.Empty);
if (!System.IO.Directory.Exists(dir))
System.IO.Directory.CreateDirectory(dir);
SpreadsheetDocument newDoc = SpreadsheetDocument.Create(filename, Document.DocumentType);
//Make sure it's clear
newDoc.DeleteParts<OpenXmlPart>(newDoc.GetPartsOfType<OpenXmlPart>());
//Copy all parts into the new book
foreach (OpenXmlPart part in Document.GetPartsOfType<OpenXmlPart>())
{
OpenXmlPart newPart = newDoc.AddPart<OpenXmlPart>(part);
}
//Perform 'save as'
newDoc.WorkbookPart.Workbook.Save();
newDoc.Close();
this.Document.Close();
//Open new doc
this.Document = SpreadsheetDocument.Open(filename, true);
}
OpenXmlPackage.SaveAs
,其中SpreadsheetDocument
是OpenXmlPackage
的子类。
此函数返回新文档,因此您可以切换到复制的文档并对其进行更改:
void FromTemplate()
{
using var template = SpreadsheetDocument.Open("Template.xlsx", isEditable: true);
using var output = (SpreadsheetDocument)template.SaveAs(path);
//no longer need to keep handle open
template.Dispose();
//apply your changes to package
}
SpreadsheetDocument.Open
之前,您需要使用stream.Seek(0, SeekOrigin.Begin)
吗?否则,由于流位于流的末尾,打开调用将接收到一个空流。 - Earth Engine