Exemple #1
0
        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;
        }