Я хочу создать новый Excel с несколькими листами, которые создаются автоматически.
Вот метод шаблона, который я создал.
Метод Generate, который я вызываю из моего ExportNormTableController.cs.
Я хочу исправить это повреждение файла и открыть Excel напрямую, потому что после генерации файла я хочу взять Excel и открыть его, и мне нужно создать новый лист, где я читаю несколько файлов .fdf и помещаю содержимое в новый созданный лист.
namespace ExportNormtables
{
public class ExportNormTablesTemplate : IDisposable
{
SpreadsheetDocument document;
private MemoryStream stream = new MemoryStream();
public ExportNormTablesTemplate(string filepath)
{
document = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
}
public byte[] Generate(DataSet ds)
{
using (document)
{
if (ds != null)
{
// Add a WorkbookPart to the document.
WorkbookPart workBookPart = document.AddWorkbookPart();
workBookPart.Workbook = new Workbook();
Sheets sheets = document.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
foreach (System.Data.DataTable table in ds.Tables)
{
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart sheetPart = workBookPart.AddNewPart<WorksheetPart>();
sheetPart.Worksheet = new Worksheet(new SheetData());
uint sheetId = 1;
if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
{
sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(sheetPart), SheetId = sheetId, Name = table.TableName };
sheets.Append(sheet);
// Get the sheetData cell table.
SheetData sheetData = sheetPart.Worksheet.GetFirstChild<SheetData>();
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
List<String> columns = new List<string>();
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (System.Data.DataRow dsrow in table.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
foreach (String col in columns)
{
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString());
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
document.Save();
}
// This is a workaround because of
// https://github.com/OfficeDev/Open-XML-SDK/issues/294
var newStream = new MemoryStream();
document.Clone(newStream);
return newStream.ToArray();
}
}
#region IDisposable Support
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
if (document != null)
{
document.Dispose();
document = null;
}
if (stream != null)
{
stream.Dispose();
stream = null;
}
}
disposedValue = true;
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly")]
public void Dispose()
{
Dispose(true);
}
#endregion
}
}
Я думаю, что проблема заключается в создании SheetData, но я не уверен.
Пожалуйста, помогите мне кто-нибудь :)
Я также открыл файл из: щелкните правой кнопкой мыши на файле> 7Zip> openArchive
и сравнил файлы (восстановил один и исходный), и здесь отсутствует папка: DocProps
Мой метод, который выполняется вызовом шаблона, выглядит так:
string filepath = "C:\\Development\\Shared\\KBE_Bearinx\\Export.xlsx";
Byte[] data = null;
using (var s = new ExportNormTablesTemplate(filepath))
{
data = s.Generate(ds);
Console.WriteLine(ds);
}
File.WriteAllBytes(@"C:\\Development\\Shared\\KBE_Bearinx\\Export.xlsx", data);
return data;
}
enter code here