none
Импорт даты и времени из Excel в DataGridView RRS feed

  • Вопрос

  • Экспортирую из DataGridView вот эту таблицу в Excel

    (пришлось удалить картинки, так как пока мой аккаунт не проверят, публиковать изображения и ссылки я не имею право)

    Вот таким способом

    object missing = Missing.Value;
                {
           Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel.Workbook excelBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                    Microsoft.Office.Interop.Excel._Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel._Worksheet)excelBook.Worksheets.get_Item(1);
    
                    excelApp.Visible = true;
    
                    excelWorksheet.Columns.ColumnWidth = 25;
                    excelWorksheet.get_Range("I1", missing).Value2 = "ID";
                    excelWorksheet.get_Range("I1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("A1", missing).Value2 = "№ Кассеты";
                    excelWorksheet.get_Range("A1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("B1", missing).Value2 = "Название кассеты";
                    excelWorksheet.get_Range("B1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("C1", missing).Value2 = "Дата";
                    excelWorksheet.get_Range("C1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("D1", missing).Value2 = "№ Сюжета";
                    excelWorksheet.get_Range("D1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("E1", missing).Value2 = "тс начало";
                    excelWorksheet.get_Range("E1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("F1", missing).Value2 = "тс конец";
                    excelWorksheet.get_Range("F1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("G1", missing).Value2 = "Описание";
                    excelWorksheet.get_Range("G1", missing).Font.Bold = true;
                    excelWorksheet.get_Range("H1", missing).Value2 = "Продолжительность";
                    excelWorksheet.get_Range("H1", missing).Font.Bold = true;
                    int i = 2;
    
    
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        excelWorksheet.get_Range("A" + i.ToString(), missing).Value2 = dr.Cells[0].Value;
                        excelWorksheet.get_Range("B" + i.ToString(), missing).Value2 = dr.Cells[1].Value;
                        excelWorksheet.get_Range("C" + i.ToString(), missing).Value2 = dr.Cells[2].Value;
                        excelWorksheet.get_Range("D" + i.ToString(), missing).Value2 = dr.Cells[3].Value;
                        excelWorksheet.get_Range("E" + i.ToString(), missing).Value2 = dr.Cells[4].Value;
                        excelWorksheet.get_Range("F" + i.ToString(), missing).Value2 = dr.Cells[5].Value;
                        excelWorksheet.get_Range("G" + i.ToString(), missing).Value2 = dr.Cells[6].Value;
                        excelWorksheet.get_Range("H" + i.ToString(), missing).Value2 = dr.Cells[7].Value;
                        excelWorksheet.get_Range("I" + i.ToString(), missing).Value2 = dr.Cells[8].Value;
                        i++;
                    }
    

    Excel это воспринимает правильно

    (пришлось удалить картинки, так как пока мой аккаунт не проверят, публиковать изображения и ссылки я не имею право)

    Теперь пробую загрузить всё это обратно из сохраненного документа вот так

    public void loadtable(string list,string file)
            {
                Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
                Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
                try
                {
                    ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                    
                    ObjWorkBook = ObjExcel.Workbooks.Open(file);
                    
                    ObjWorkSheet = ObjExcel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;
                    Microsoft.Office.Interop.Excel.Range rg = null;
    
                    DataRow newRow = databaseDataSet.Архив.NewRow();
                    int RowIndex = dataGridView1.RowCount - 1;
                    
    
                    Int32 row = 2;
                   
                    databaseDataSet.Архив.Clear();
                    dataGridView1.Update();
    
                    List<String> arr = new List<string>();
                    while (ObjWorkSheet.get_Range("a" + row, "a" + row).Value != null)
                    {
                        
                        rg = ObjWorkSheet.get_Range("a" + row, "i" + row);
                        foreach (Microsoft.Office.Interop.Excel.Range item in rg)
                        {
                            try
                            {
                                arr.Add(item.Value.ToString().Trim());
                            }
                            catch { arr.Add(""); }
                        }
    
                        архивTableAdapter.Insert(row-1, arr[0].ToString(), arr[1].ToString(), arr[2].ToString(), arr[3].ToString(), arr[4].ToString(), arr[5].ToString(), arr[6].ToString(), arr[7].ToString());
                        dataGridView1.Update();
                        arr.Clear();
                        row++;
                    }
    
                    MessageBox.Show("Файл успешно считан!", "Считывания excel файла", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message, "Ошибка при считывании excel файла", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                finally
                {
                    ObjExcel.Quit();
                    ObjWorkBook = null;
                    ObjWorkSheet = null;
                    ObjExcel = null;
                    GC.Collect();
    
                    
                   
                    this.архивTableAdapter.Fill(this.databaseDataSet.Архив);
                    
                }
    }

    И всё вроде бы правильно, только отображаемый  формат даты и времени мне не очень понятен.

    (пришлось удалить картинки, так как пока мой аккаунт не проверят, публиковать изображения и ссылки я не имею право)

    вот кусок таблицы из Excel:

    № Кассеты Название кассеты Дата № Сюжета тс начало тс конец Описание Продолжительность ID
    1 Название 1 1.01.10 Название сюжета 1 0:00:00 0:05:00 Описание 1 0:05:00 1
    1 Название 1 02.01.2010 На правом берегу 0:05:00 0:10:00 Описание 0:05:00 2
    1 Название 1 02.01.2010 Надувные склады 0:10:00 1:00:03 Описание 0:50:03 3

    После импорта колонки "тс начало" , "тс конец" и "Продолжительность" имеют вот такой формат: "0,00347222222222222"- это "0:05:00"

    Колонка дата отображается так же нормально как и до импорта

    В самом Excel формат этих ячеек такой: "ч:мм:сс"

    Изменения DedaultCellStyle в DataGridView для этих столбцов не приносит результата. Пробовал и "hh:mm:ss" и "ч:мм:сс". 

    P.S. прошу прощения если что не так написал, так как это мой первый вопрос на данном ресурсе. попытался задать максимально развёрнуто.


    • Изменено romanprog 4 ноября 2012 г. 5:21
    4 ноября 2012 г. 5:17

Ответы

  • Если вы поделите 5 на 0,00347222222222222, то получите 1440. Это число минут в сутках. Excel специфично представляет дату/время в виде числа. Целая часть - число дней с некой даты X(выясните сами, если интересно :) ), а дробная - равномерно размазывает момент в сутках в диапазоне [0..0.(9)].   
    • Помечено в качестве ответа romanprog 7 ноября 2012 г. 18:19
    5 ноября 2012 г. 21:39