функция OpenXML spreadsheat сохранить как
У меня есть электронная таблица Excel 2007, которую я редактирую с помощью OpenXML SDK 2. Я удаляю некоторые строки и т. д. Я хотел бы знать, как сохранить этот Spreadsheetdocument в другое имя файла.
4 ответов
насколько мне известно, нет встроенного способа изменить имя файла, но поскольку один из способов редактирования файла-использовать потоки, вы можете легко дать имя файла, который вы хотите при написании содержимого потока:
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, но это зависит от того, что вы пытаетесь сделать.
посмотрите на эту библиотеку ClosedXML который основан на OpenXML; это упрощает много операций с документами и дает вам 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 минут, а также я сделал экспорт в excel за 10 минут с помощью этого инструмента.
вот мое решение для сохранения как, протестировано со сложной книгой, которая имеет макросы и условное форматирование и т. д. (этот метод находится в оболочке, которая имеет свойство 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);
}