web-dev-qa-db-ja.com

openxml Spreadsheatsave-as

OpenXML SDK2で編集するExcel2007スプレッドシートがあります。いくつかの行などを削除します。そのSpreadsheetdocumentを別のファイル名に保存する方法を知りたいです。

16
jwdehaan

私の知る限り、ファイル名を変更する組み込みの方法はありませんが、ファイルを編集する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アプリケーションでファイルをユーザーに返す場合など、名前を変更する方法は他にもありますが、それは何をしようとしているかによって異なります。

14
amurra

OpenXMLに基づくこのライブラリClosedXMLをご覧ください。多くのドキュメント操作を簡素化し、SaveAsメソッドを提供します。これがあなたができることの例です。

        var workbook = new XLWorkbook();
        var worksheet = workbook.Worksheets.Add("Sample Sheet");
        worksheet.Cell("A1").Value = "Hello World!";
        workbook.SaveAs("HelloWorld.xlsx");
9
FabioThorin

ClosedXMLを強くお勧めします-初めて使用し、最初は標準のOpen XML 2.0SDKを使用して数時間で「Excelからインポート」機能を実行しました-15分未満で書き直しました。このツールを使用して、Excelへのエクスポートを10分で完了しました。

4
Edi

その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
}

参照: 方法:ファイルとフォルダーのコピー、削除、および移動(C#プログラミングガイド)

2
劉鎮瑲

これが、マクロや条件付き書式などを含む複雑なブックでテストされた、名前を付けて保存するための私のソリューションです(このメソッドは、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);
    }
1
Teagan42

この機能が導入されたバージョンはわかりませんが、使用しています 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
}
0
Shimmy