示例#1
0
        public void TestExcelExample1()
        {
            string pathExcel = Path.Combine(Environment.CurrentDirectory, "Data\\Example1.xlsx");
            string pathTemp  = TestLibrary.getTempFilename(".dbf");

            Xml_Form form  = generateForm();
            Excel    excel = new Excel();
            DBF      dbf   = new DBF(pathTemp, form.DBF);

            try
            {
                excel.OpenWorksheet(pathExcel);

                Work            work      = new Work(excel.worksheet, form, 120);
                Logger.LogLevel old_level = Logger.Level;
                Logger.SetLevel(Logger.LogLevel.TRACER);
                work.IterateRecords(dbf.appendRecord);
                Logger.SetLevel(old_level);
            }
            finally
            {
                dbf.close();
                excel.close();
            }
        }
示例#2
0
        public void Startup()
        {
            Logger.SetLevel(Logger.LogLevel.DEBUG);

            encoding    = Encoding.UTF8;
            fields      = TestRepository.getFields();
            variables   = TestRepository.getVariables();
            dbfFileName = Path.GetTempFileName();

            dbf = new DBF(dbfFileName, fields, encoding);
            dbf.appendRecord(variables);
            Assert.AreEqual(dbf.Writed, 1);
            dbf.close();
        }
示例#3
0
        /// <summary>
        /// Основной поток обработки
        /// </summary>
        /// <param name="obj">Форма процесса обработки, главная форма, список файлов для обработки</param>
        protected void delegate_action(object obj)
        {
            object [] data = (object[])obj;

            StatusWindow  window = (StatusWindow)data[0];
            MainWindow    wmain  = (MainWindow)data[1];
            List <string> files  = (List <string>)data[2];

            window.setState(true, "Подготовка файлов", 0, files.Count);

            wmain.Log(DataLog.LogImage.NONE, DateTime.Now.ToString("Начало конвертации dd.MM.yyyy в HH:mm:ss"));
            wmain.Log(DataLog.LogImage.NONE, "Директория: " + LastLaunch.Default.inputDirectory);
            wmain.Log(DataLog.LogImage.NONE, "Задано файлов для обработки: " + files.Count);

            if (config.only_rules)
            {
                CheckRules(files, window, wmain);
                return;
            }

            int   errcount    = 0;
            bool  reopenExcel = true;
            Excel excel       = null;
            DBF   dbf         = null;

            Stopwatch totalwatch = Stopwatch.StartNew();

            for (int idoc = 0; idoc < files.Count; idoc++)
            {
                string pathFull = files[idoc];
                string filename = Path.GetFileName(pathFull);
                string pathTemp = Path.GetTempFileName();

                bool deleteDbf = false;

                if (reopenExcel)
                {
                    excel       = new Excel();
                    reopenExcel = false;
                }

                try
                {
                    Logger.info("");
                    Logger.debug("");
                    Logger.debug("==============================================================");
                    Logger.info($"======= Загружаем Excel документ: {filename} ======");
                    Logger.debug("==============================================================");
                    window.updateState(true, $"Документ: {filename}", idoc);

                    excel.OpenWorksheet(pathFull);

                    var form = findCorrectForm(excel.worksheet, config);
                    if (form == null)
                    {
                        string warning = $"Для документа '{filename}' не найдено подходящих форм обработки!";
                        Logger.warn(warning);
                        wmain.Log(DataLog.LogImage.WARNING, warning);
                        throw new ArgumentNullException(warning);
                    }

                    string fileName   = getOutputFilename(excel.worksheet, pathFull, config.outfile.simple, config.outfile.script);
                    string pathOutput = Path.Combine(LastLaunch.Default.outputDirectory, fileName);

                    dbf = new DBF(pathTemp, form.DBF);

                    var total = excel.worksheet.UsedRange.Rows.Count - form.Fields.StartY;
                    window.setState(false, $"Обработано записей: {0}/{total}", 0, total);

                    Work     work    = new Work(form, config.buffer_size);
                    TimeSpan elapsed = work.IterateRecords(excel.worksheet, dbf.appendRecord,
                                                           id => window.updateState(false, $"Обработано записей: {id}/{total}", id)
                                                           );

                    dbf.close();

                    // Перемещение файла
                    if (File.Exists(pathOutput))
                    {
                        File.Delete(pathOutput);
                    }
                    File.Move(pathTemp, pathOutput);
                    Logger.debug($"Перемещение файла с {pathTemp} в {pathOutput}");

                    wmain.Log(
                        DataLog.LogImage.SUCCESS,
                        $"Документ '{filename}' в {dbf.Writed} строк успешно обработан за {elapsed:hh\\:mm\\:ss\\.ff}."
                        );
                    outlog.Add($"{filename} в {dbf.Writed} строк за {elapsed:hh\\:mm\\:ss\\.ff}");

                    Logger.info("Времени потрачено на обработку данных: " + elapsed);
                    Logger.info("Обработано записей: " + dbf.Writed);
                    Logger.debug($"Начиная с {form.Fields.StartY} по {form.Fields.StartY + dbf.Writed}");
                    Logger.info($"=============== Документ {Path.GetFileName(pathFull)} успешно обработан! ===============");
                }
                catch (Exception ex) when(!DEBUG)
                {
                    bool addToFormLog = true;

                    if (ex is COMException)
                    {
                        Logger.error("Excel вероятнее всего крашанулся, он будет перезапущен для следующего документа в очереди!");
                        reopenExcel = true;
                    }

                    if (ex is ThreadAbortException || ex.InnerException is ThreadAbortException)
                    {
                        Logger.warn($"Пользователь вышел во время процесса конвертации документа '{filename}'!");
                        goto skip_error_msgbox;
                    }

                    if (ex is ArgumentNullException)
                    {
                        if (!config.no_form_is_error)
                        {
                            continue;
                        }
                        addToFormLog = false;
                    }

                    if (addToFormLog)
                    {
                        wmain.Log(DataLog.LogImage.ERROR, $"Документ '{filename}' был пропущен из-за ошибки!\n{ex.Message}");
                    }
                    Logger.error($"Документ {filename} был пропущен из-за ошибки:\n{ex.Message}\n\n{ex.StackTrace}");

skip_error_msgbox:
                    errcount++;
                    deleteDbf = true;
                }
                finally
                {
                    Logger.debug("Закрытие COM Excel и DBF");
                    dbf?.close();
                    if (deleteDbf)
                    {
                        dbf?.delete();
                    }
                }
            }
            totalwatch.Stop();

            // Не забываем завершить Excel
            excel.close();

            string msgTotal = $"\nВремени затрачено суммарно: {totalwatch.Elapsed:hh\\:mm\\:ss\\.ff}";

            wmain.Log(DataLog.LogImage.INFO, msgTotal);
            Logger.info(msgTotal);

            if (errcount > 0)
            {
                wmain.Log(DataLog.LogImage.ERROR, config.warning ?? "{0}");
            }

            wmain.toggleConvertButton(true);
            updateDirectory();
            wmain.BeginInvoke((MethodInvoker)wmain.fillElementsData);
            window.mayClose();
        }
示例#4
0
 public void RepeatClose()
 {
     dbf.close();
     dbf.close();
 }