Экспорт таблицы SQL в Excel на C # — это случайный выбор форматов ячеек для дат

#c# #sql-server #excel #office-interop

#c# #sql-сервер #excel #office-interop

Вопрос:

Я пытаюсь экспортировать набор данных SQL в документ Excel.

В определенные моменты при выводе полей даты ячейки Excel форматируются в определенные моменты как ячейки даты, а некоторые — как общие. Это приводит к отображению дат в том формате, который я хочу, день / месяц / год в британском стиле, месяц / день / год в американском стиле.

Если бы это был только один способ, это было бы прекрасно, потому что отчет был бы, по крайней мере, согласованным. Однако тот факт, что код когда-нибудь выведет правильный формат, а иногда и нет, очень раздражает

Мой код пока:

 private void doReport(DataSet myDS)
    {
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        int i;

        object misValue = System.Reflection.Missing.Value;
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkSheet = xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        xlWorkSheet.Cells[1, 1] = "Report produced on the "   System.DateTime.Now.ToString("dd/MM/yyyy");

        xlWorkSheet.Cells[3, 1] = "Project Type";
        xlWorkSheet.Cells[3, 2] = "Client";
        xlWorkSheet.Cells[3, 3] = "Date Started";
        xlWorkSheet.Cells[3, 4] = "Target Date";
        xlWorkSheet.Cells[3, 5] = "Date Completed";
        xlWorkSheet.Cells[3, 6] = "Stage Target";
        xlWorkSheet.Cells[3, 7] = "Stage";
        xlWorkSheet.Cells[3, 8] = "Assigned To";
        xlWorkSheet.Cells[3, 9] = "Notes";

        i = 4;

        foreach (DataRow row in myDS.Tables[0].Rows)
        {
            xlWorkSheet.Cells[i, 1] = row["strProjectDescription"];
            xlWorkSheet.Cells[i, 2] = row["strClient"];
            DateTime dteProjStart = (DateTime)row["dteProjectStart"];
            xlWorkSheet.Cells[i, 3] = dteProjStart.ToString("dd/MM/yyyy");
            DateTime dteProjTarget = (DateTime)row["dteProjectTarget"];
            xlWorkSheet.Cells[i, 4] = dteProjTarget.ToString("dd/MM/yyyy");
            if (rbViewProjectsCompletedVal.Checked)
            { 
                DateTime dteProjFin = (DateTime)row["dteProjectFinished"];
                xlWorkSheet.Cells[i, 5] = dteProjFin.ToString("dd/MM/yyyy");
            }
            if (row.IsNull("dteProjectStageTarget") == false)
            {
                DateTime dteProjStageTar = (DateTime)row["dteProjectStageTarget"];
                xlWorkSheet.Cells[i, 6] = dteProjStageTar.ToString("dd/MM/yyyy");
            }
            xlWorkSheet.Cells[i, 7] = row["strProjectStageDescription"];
            xlWorkSheet.Cells[i, 8] = row["initials"];
            xlWorkSheet.Cells[i, 9] = csSQL.runSQL("select strProjectNotes from tbl_AdminSupport_Projects where intASProjectID = "   row["intASProjectID"], "Management").Tables[0].Rows[0]["strProjectNotes"];

            i  ;
        }


        xlWorkSheet.Columns.AutoFit();
        xlWorkSheet.Rows.AutoFit();
        xlApp.Visible = true;

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
  

Структура набора данных:

Любой элемент с префиксом str является nvarchar (max), dte — это дата

Комментарии:

1. Ваш собственный код хранит строки в ячейках вместо фактических значений DateTime

2. За исключением того, что отчет завершен, некоторые ячейки были отформатированы как ячейки с датой, а остальные отображают дату в американском стиле. Остальные ячейки отформатированы в общем виде так, чтобы дата отображалась в британском стиле. Я хочу, чтобы информация выводилась в виде строк в формате UK. Где-то по ходу дела она изменяется обратно на формат даты в Excel.

3. Кажется, я помню, что Excel будет использовать значения в первых x строках, чтобы определить тип данных для столбца, поэтому, если первые x строк содержат null в определенном столбце, он, вероятно, будет использовать General. Поскольку вы выводите данные в формате «дд / ММ / гггг», я бы предположил, что они являются общими, а формат даты в США интерпретируется как даты. Я обнаружил эту проблему при выводе в CSV, а затем открытии его в Excel. Поскольку вы взаимодействуете через Excel Interop, почему бы вам не ввести свои выходные данные, а не использовать string для всего?

4. @MattBartlett нет «формата даты». Там указано значение и то, как оно отформатировано для отображения. Это контролируется стилем ячейки, который ваш код не задает. Это означает, что Excel попытается угадать, что это за текст в этой ячейке. Если это может быть отображено как дата, это будет отображаться как дата, используя языковой стандарт конечного пользователя . Если нет, то это обрабатывается как текст

5. @MattBartlett начните с сохранения значений DateTime, чтобы Excel не приходилось угадывать. Затем установите стиль ячейки на тот, который вы хотите.