Итак, я хочу добавить лист в существующий XLSX, и он, кажется, работает, но при открытии он выдает ошибку, и Excel нуждается в ее исправлении, я попытался посмотреть с помощью инструмента повышения производительности xml, но ничего не смог найти это выглядело неуместно
public static void ExportExcel(string Query, string targetFileName, Boolean Overwrite, string Sheet) {
FileInfo fi = new FileInfo(targetFileName);
string filePath = fi.DirectoryName;
string fileName = fi.Name;
if (filePath == string.Empty || fileName == string.Empty) {
throw new Exception(string.Format("{0}: is invalid", targetFileName));
}
if (fi.Exists == true && !Overwrite) {
bfirst = true;
//throw new Exception("File already exists, and OverwriteIfExists was specified as false.");
}
if (fi.Exists == true && Overwrite == true) {
fi.Delete();
}
if (bfirst == false) {
using (SpreadsheetDocument document = SpreadsheetDocument.Create(targetFileName, SpreadsheetDocumentType.Workbook)) {
using (SqlConnection conn = new SqlConnection(_sqlConnStr)) {
SqlDataAdapter da = new SqlDataAdapter(Query, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Q1");
DataTable table = ds.Tables["Q1"];
var workbookPart = document.AddWorkbookPart();
document.WorkbookPart.Workbook = new Workbook();
document.WorkbookPart.Workbook.Sheets = new Sheets();
var sheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
//Autofit comes first – we calculate width of columns based on data
sheetPart.Worksheet = new Worksheet();
SheetViews sheetViews1 = new SheetViews();
SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U };
Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
sheetView1.Append(pane1);
sheetViews1.Append(sheetView1);
sheetPart.Worksheet.Append(sheetViews1);
sheetPart.Worksheet.Append(AutoFit_Columns(table));
sheetPart.Worksheet.Append(sheetData);
//Adding styles to worksheet
Worksheet_Style(document);
Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = document.WorkbookPart.GetIdOfPart(sheetPart);
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0) {
sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = Sheet };
sheets.Append(sheet);
Row headerRow = new Row(); //Adding column headers
for (int col = 0; col < table.Columns.Count; col++) {
Cell cell = new Cell {
DataType = CellValues.String,
CellValue = new CellValue(table.Columns[col].ColumnName.ToString()),
StyleIndex = 1// bold font
};
headerRow.AppendChild(cell);
}
// Add the row values to the excel sheet
sheetData.AppendChild(headerRow);
for (int row = 0; row < table.Rows.Count; row++) {
Row newRow = new Row();
for (int col = 0; col < table.Columns.Count; col++) {
Cell cell = new Cell();
//ommited for readability
}
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
}
} else {
//Add a New Sheet to the newly created .xlsx file
AddSheet(targetFileName,
Query,
Sheet);
}
}
private static void AddSheet(string targetFileName, string Query, string Sheet) {
using (SqlConnection conn = new SqlConnection(_sqlConnStr)) {
SqlDataAdapter da = new SqlDataAdapter(Query, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Q1");
DataTable table = ds.Tables["Q1"];
using (SpreadsheetDocument document = SpreadsheetDocument.Open(targetFileName, true)) {
WorksheetPart sheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
sheetPart.Worksheet = new Worksheet();
Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = document.WorkbookPart.GetIdOfPart(sheetPart);
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0) {
sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
//Autofit comes first – we calculate width of columns based on data
var sheetData = new SheetData();
//sheetPart.Worksheet = new Worksheet();
SheetViews sheetViews1 = new SheetViews();
SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = sheetId };
Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
sheetView1.Append(pane1);
sheetViews1.Append(sheetView1);
sheetPart.Worksheet.Append(sheetViews1);
sheetPart.Worksheet.Append(AutoFit_Columns(table));
sheetPart.Worksheet.Append(sheetData);
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = Sheet + "_" + sheetId };
sheet.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
sheets.Append(sheet);
//Can only add one stylesheet
//Worksheet_Style(document);
Row headerRow = new Row(); //Adding column headers
for (int col = 0; col < table.Columns.Count; col++) {
Cell cell = new Cell {
DataType = CellValues.String,
CellValue = new CellValue(table.Columns[col].ColumnName.ToString()),
StyleIndex = 1// bold font
};
headerRow.AppendChild(cell);
}
// Add the row values to the excel sheet
sheetData.AppendChild(headerRow);
for (int row = 0; row < table.Rows.Count; row++) {
Row newRow = new Row();
for (int col = 0; col < table.Columns.Count; col++) {
Cell cell = new Cell();
//ommited for readability
}
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
}
}
Первая часть кода генерирует xlsx, который работает нормально и открывается нормально, но когда я снова запускаю программу, чтобы добавить второй лист, она делает все это, но Excel не делает Мне не нравится то, как я это сделал, и, по-видимому, он нуждается в ремонте. Это журнал ошибок из Excel
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error116880_01.xml</logFileName>
<summary>Er zijn fouten aangetroffen in bestand \file1.xlsx</summary>
<removedFeatures><removedFeature>Verwijderde functie: Weergave van het onderdeel /xl/worksheets/sheet2.xml</removedFeature></removedFeatures>
</recoveryLog>
. Это вызывает ошибку, мой вопрос: как мне также заморозить верхнюю строку на вторая вкладка
SheetViews sheetViews1 = new SheetViews();
SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = sheetId };
Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
sheetView1.Append(pane1);
sheetViews1.Append(sheetView1);
sheetPart.Worksheet.Append(sheetViews1);