экспортированная таблица данных с использованием open XML не отсортирована в Excel - PullRequest
0 голосов
/ 14 февраля 2020

Я создаю файл 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;
    }
...