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


Часто в процессе работы требуется загрузить накладные, прайс-листы из файлов 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. Загрузка идет корректно, файлы предварительного открытия не требуют.

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


Если у вас возникли вопросы, вы можете обратиться к нашим специалистам