#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 не приходилось угадывать. Затем установите стиль ячейки на тот, который вы хотите.