internal void LoadFile(string FileName) { openFileDialog.FileName = FileName; lbSheets.Items.Clear(); XlsFile xls = new XlsFile(); xls.HeadingColWidth = -1; xls.HeadingRowHeight = -1; xls.Protection.OnPassword += new OnPasswordEventHandler(GetPassword); xls.Open(FileName); for (int i = 1; i <= xls.SheetCount; i++) { lbSheets.Items.Add(xls.GetSheetName(i)); } lbSheets.SelectedIndex = xls.ActiveSheet - 1; flexCelImgExport1.Workbook = xls; MainPreview.InvalidatePreview(); Text = "Custom Preview: " + openFileDialog.FileName; //btnHeadings.Checked = flexCelImgExport1.Workbook.PrintHeadings; //btnGridLines.Checked = flexCelImgExport1.Workbook.PrintGridLines; btnFirst.Enabled = true; btnPrev.Enabled = true; btnNext.Enabled = true; btnLast.Enabled = true; edPage.Enabled = true; btnZoomIn.Enabled = true; edZoom.Enabled = true; btnZoomOut.Enabled = true; btnGridLines.Enabled = true; btnHeadings.Enabled = true; btnRecalc.Enabled = true; btnPdf.Enabled = true; }
/// <summary> /// Читает данные с текущего листа XLS-файла. /// </summary> /// <param name="xlsFile">XSL-файл.</param> /// <returns>Таблица с прочитанными данными.</returns> private static DataTable ReadDataTable(XlsFile xlsFile) { // установить имя таблицы DataTable table = new DataTable(xlsFile.GetSheetName(xlsFile.ActiveSheet)); // первая строка - названия столбцов // вторая строка - типы столбцов if (xlsFile.RowCount < 2) throw new CoreInvalidOperationException(Resources.ResourceManager.GetString("InvalidFileFormatException")); // прочитать имена столбцов для таблицы for (int col = 0; col < xlsFile.ColCount; col++) { if (xlsFile.GetCellValue(1, col + 1) == null) break; // прочитать тип столбца Type columnType = Type.GetType(xlsFile.GetCellValue(2, col + 1).ToString(), false); if (columnType == null) throw new CoreInvalidOperationException(Resources.ResourceManager.GetString("InvalidFileFormatException")); table.Columns.Add(xlsFile.GetCellValue(1, col + 1).ToString(), columnType); } // прочитать данные int rowFrom = 2; /* XlsFile тупо обрабатывает * вложенные картинки. Поместить картинку в определённую клетку можно, * а вот взять её из клетки нельзя. Взять картинку можно только из массива * рисунков Excel, начинающегося почему то с 2 (хотя в доке написано ч 1!). * Будем надеяться, что они там в правильном порядке лежат. */ int imageCount = 2; for (int row = rowFrom; row < xlsFile.RowCount; ++row) { // Т.к. XlsFile очень часто врёт по поводу количества строк в файле, // то мы подстраховываемся таким образом. Считаем, что данные кончились, // если колонка 'A' в строке пустая if (xlsFile.GetCellValue(row + 1, 1) == null) break; object[] values = new object[table.Columns.Count]; for(int col = 0; col < table.Columns.Count; ++col) { if(table.Columns[col].DataType == typeof( byte[] )) { TXlsImgType imageType = TXlsImgType.Unknown; values[col] = ConvertValue( xlsFile.GetImage( imageCount++, ref imageType ), table.Columns[col].DataType ); } else { values[col] = ConvertValue( xlsFile.GetCellValue( row + 1, col + 1 ), table.Columns[col].DataType ); } } table.Rows.Add(values); } return table; }