OpenXML SDK2で編集するExcel2007スプレッドシートがあります。いくつかの行などを削除します。そのSpreadsheetdocumentを別のファイル名に保存する方法を知りたいです。
私の知る限り、ファイル名を変更する組み込みの方法はありませんが、ファイルを編集する1つの方法はストリームを使用することなので、ストリームの内容を書き出すときに必要なファイルの名前を簡単に指定できます。
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を強くお勧めします-初めて使用し、最初は標準のOpen XML 2.0SDKを使用して数時間で「Excelからインポート」機能を実行しました-15分未満で書き直しました。このツールを使用して、Excelへのエクスポートを10分で完了しました。
そのSpreadsheetdocumentを別のファイル名に保存し、それを開いて編集することができます。
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
}
これが、マクロや条件付き書式などを含む複雑なブックでテストされた、名前を付けて保存するための私のソリューションです(このメソッドは、SpreadsheetDocumentプロパティ "Document"を持つラッパーにあります)。
/// <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
}