Я создаю файл Excel из DataTable, используя open XML. DataTable сортируется (например, startdate или step-nr), но когда я экспортирую его в файл .xlsx, он больше не сортируется. В чем проблема?
DataTable выглядит следующим образом:
Name | Step | Date
test | 1 | 19.01.2020
test2 | 2 | 20.01.2020
test3 | 3 | 21.01.2020
, но мой файл Excel выглядит следующим образом:
Name | Step | Date
test3 | 3 | 21.01.2020
test | 1 | 19.01.2020
test2 | 2 | 20.01.2020
Мой код выглядит так, чтобы экспортировать DataTable в Excel- файл (.xlsx):
public static void Export_to_Excel(DataTable dt, string file_name)
{
String file_path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop).ToString() + "\\" + file_name + ".xlsx";
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.InitialDirectory = Convert.ToString(Environment.SpecialFolder.Desktop);
saveFileDialog.Filter = "Excel-Arbeitsmappe |*.xlsx";
saveFileDialog.Title = "Speichern als";
saveFileDialog.FileName = file_name;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
file_path = saveFileDialog.FileName;
}
else
{
return;
}
using (var workbook = SpreadsheetDocument.Create(file_path, SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new Workbook();
workbook.WorkbookPart.Workbook.Sheets = new Sheets();
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
sheetPart.Worksheet = new Worksheet();
sheetPart.Worksheet.Append(AutoFit_Columns(dt));
sheetPart.Worksheet.Append(sheetData);
Worksheet_Style(workbook);
Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = workbook.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 = "List " + sheetId };
sheets.Append(sheet);
Row headerRow = new Row();
for (int col = 0; col < dt.Columns.Count; col++)
{
Cell cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue(dt.Columns[col].Caption),
StyleIndex = 1
};
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
for (int row = 0; row < dt.Rows.Count; row++)
{
Row newRow = new Row();
for (int col = 0; col < dt.Columns.Count; col++)
{
Cell cell = new Cell();
cell.DataType = new EnumValue<CellValues>(CellValues.String);
cell.CellValue = new CellValue(dt.Rows[row][col].ToString());
cell.StyleIndex = 0;
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
}
AutoFit_Columns:
private static Columns AutoFit_Columns(DataTable dt)
{
Columns cols = new Columns();
int Excel_column = 1;
foreach(DataColumn col in dt.Columns)
{
double max_width = 14.5f; //default
//längster string wird gesucht
string longest_string = dt.AsEnumerable().Select(row => row[col].ToString()).OrderByDescending(st => st.Length).FirstOrDefault();
double cell_width = GetWidth(new System.Drawing.Font("Arial", 10), longest_string);
if (cell_width > max_width)
{
max_width = cell_width;
}
//spalte an das worksheet anhängen
Column c = new Column() { Min = Convert.ToUInt32(Excel_column), Max = Convert.ToUInt32(Excel_column), Width = max_width, CustomWidth = true };
cols.Append(c);
Excel_column++;
}
return cols;
}