Загрузка данных из xls файлов при помощи Excel или OpenOffice

Методика загрузки табличных данных из Excel и Open Office
Часто в процессе работы требуется загрузить накладные, прайс-листы из файлов xls в 1С. Ниже я расскажу как можно сделать чтение из файла xls как при помощи Excel, так и при помощи бесплатного офисного пакета OpenOffice.
Сначала определим какое приложение присутствует на компьютере пользователя:
Попытка
   Excel = Новый COMОбъект("Excel.Application");
   МетодЗагрузки="Excel";
Исключение
   Попытка
      OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager");
      МетодЗагрузки="OO";
      Исключение
      МетодЗагрузки="Неопределено";
   КонецПопытки;
КонецПопытки;


Затем получим сам документ:

Если МетодЗагрузки = "Excel" Тогда
   Excel = Новый COMОбъект("Excel.Application");
   Документ = Excel.Workbooks.Open(ВыборФайла);
ИначеЕсли МетодЗагрузки = "OO" Тогда
   OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager");
   scr = Новый COMОбъект("MSScriptControl.ScriptControl");
   scr.language = "javascript";
   scr.eval("MassivParametrov = new Array()");
   MassivParametrov = scr.eval("MassivParametrov");
   scr.AddObject("OpenOffice", OpenOffice);
   scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("MassivParametrov[0].Name='Hidden'");
   scr.eval("MassivParametrov[0].Value=true");
   FileName = СтрЗаменить(ВыборФайла," ","%20" );
   FileName = СтрЗаменить(FileName,"\","/");
   FileName = "file:/" + "/localhost/" + FileName;
   Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop");
   Документ = Desktop.LoadComponentFromURL(FileName, "_blank", 0, MassivParametrov);
ИначеЕсли МетодЗагрузки = Неопределено Тогда
   Предупреждение("Отсутствует приложение для загрузки документа!");
КонецЕсли;

После этого можно производить непосредственно чтение из документа и заполнять соответствующую таблицу значений. Чтение осуществляется следующими методами: для Excel

Документ.Sheets(НомерЛиста).Cells(НомерСтроки,НомерСтолбца).Value;

для OpenOffice:

Sheets = Документ.getSheets();
ЛистCalc = Sheets.getByName(НомерЛиста);
ЛистCalc.getCellByPosition(НомерСтолбца,НомерСтроки).getString();
 

Обращаю ваше внимание на то, что в OpenOffice в отличие от Excel нумерация ведется с 0, а не с 1, а также обратный порядок параметров позиции ячейки.После обработки данных необходимо закрыть COMОбъект, иначе процесс так и будет сидеть в памяти компьютера.
Делается это следующим образом:


Если МетодЗагрузки="Excel" Тогда
   Попытка
      Excel.Workbooks.Close();
      Excel.Quit();
   Исключение
      Сообщить("Попытка закрыть Excel потерпела неудачу.");
   КонецПопытки;
ИначеЕсли МетодЗагрузки="OO" Тогда
   Попытка
      Документ.Close(true);
      Desktop.terminate();
   Исключение
      Сообщить("Попытка закрыть OpenOffice потерпела неудачу.");
   КонецПопытки;
Конецесли;

P.S. Описанные методы протестированы на Microsoft Office 2010 и OpenOffice 3.3. Загрузка идет корректно, файлы предварительного открытия не требуют.

Тельнова Яна.


Вернуться обратно
ОПУБЛИКОВАТЬ В СОЦ.СЕТЯХ
Моя корзина
Отложенные
Недоступно
Избранное

Ваша корзина пуста, для оформления заказа перейдите в каталог и выберите интересующие вас товары

Перейти в каталог

Перейти в каталог

Товары, недоступные к заказу

Добавляйте ваши товары в избранное

Перейти в каталог

Избранное

Добавляйте ваши товары в избранное

Перейти в каталог