Группа: Пользователи
Сообщений: 86
Спасибо сказали: 5 раз
Рейтинг: 5
ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.Прочитать("D:\Temp\123.xls", СпособЧтенияЗначенийТабличногоДокумента.Значение);
Сохраняю на диск банковские выписки из "Приват24 для бизнеса". При попытке загрузить в ТабличныйДокумент возникает ошибка: Ошибка при выполнении файловой операции . Формат файла не поддерживается.
Открываю документ в Excel и сохранить его (после этого размер файла увеличивается). После этого загрузка проходит нормально. Как до так и после пересохранения формат файла не меняется (в заголовке символы "РПаЎ±б"). Ни версия платформы 1С, ни изменение расширения файла на это влияет. Чтобы обойти эту проблему, перед чтением документа в табличный документ, запускаю Application.Excel, открываю его и пересохраняю. Но если на пк не установлен Excel, то это уже не поможет.
Можно ли как-то это исправить? Или есть ли какая-то утилита для или способ открытия/сохранения документа excel без установленного Excel?
Описание варианта метода: Чтение табличного документа из потока. При чтении из потока допускается использование только следующих форматов: MXL, MXL7, ODS.
Группа: Пользователи
Сообщений: 86
Спасибо сказали: 5 раз
Рейтинг: 5
Цитата(denis84 @ 15.03.24, 14:35)
а якщо спробувати перейменовувати(копыювати) файл, а потым выдкривати ы считувати
Пробував, не допомогло. Завантажені файли не коректні. У результаті зробив перезбереження через OLE. Якщо встановлено ексел, то через нього, інакше через OpenOffice
Slon747 @ 15.03.24, 16:49
, В напрямку LibreOffice не дивилися? Я усе через нього роблю.
Процедура ЗагрузитьИзФайла() ТипФайла = 0; //0-файл не прочитан,1- для МС Экселя,2- для ОпенОфиса Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Фильтр = "Табличный документ(*.xls)|*.xls|Табличный документ(*.xlsx)|*.xlsx"; Если не Диалог.Выбрать() Тогда Возврат; КонецЕсли; Если ДанныеФайла.Количество()>0 Тогда Режим = РежимДиалогаВопрос.ДаНет; Текст = "ru = ""Табличная часть будет очищена, продолжить?"";" + " uk = ""Таблична частина буде очищена, продовжити?"""; Ответ = Вопрос(НСтр(Текст), Режим, 0); КонецЕсли; Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; ТабЗн = Новый ТаблицаЗначений; Попытка ТабЗн.Прочитать(Диалог.ПолноеИмяФайла); ТипФайла = 1; Исключение КонецПопытки; Если ТипФайла=0 Тогда Попытка ТабЗн=ОО.ЗагрузитьТЗизФайла(Диалог.ПолноеИмяФайла,1); ТипФайла = 2; Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдено подходящего приложения для загрузки файла"+Символы.ПС+ОписаниеОшибки(); Сообщение.Сообщить(); Возврат; КонецПопытки; КонецЕсли; ДанныеФайла.Очистить(); Шкут_Общий.ДополнитьКолонкиТаблицыЗначений(ДанныеФайла,ТабЗн); ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТабЗн,ДанныеФайла); ДанныеФайла.Колонки.Добавить("Проект",Новый ОписаниеТипов("СправочникСсылка.Проекты")); ДанныеФайла.Колонки.Добавить("Счет",Новый ОписаниеТипов("ДокументСсылка.СчетНаОплатуПокупателю")); ДанныеФайла.Колонки.Добавить("Корр",Новый ОписаниеТипов("ДокументСсылка.КорректировкаДолга"));
ЭлементыФормы.ДанныеФайла.СоздатьКолонки(); Для Каждого Колонка из ЭлементыФормы.ДанныеФайла.Колонки Цикл Колонка.Ширина = 4; КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанель2ВосстановитьДаты(Кнопка) Колонка = ЭлементыФормы.ДанныеФайла.ТекущаяКолонка; Для Каждого Строка из ДанныеФайла Цикл Если ЗначениеЗаполнено(Строка[Колонка.Имя]) Тогда Попытка Строка[Колонка.Имя] = Дата("19000101")+((Строка[Колонка.Имя]-2)*24*60*60); Исключение КонецПопытки; КонецЕсли; КонецЦикла; КонецПроцедуры
Функция ЗагрузитьТЗизФайла(ПутьКФайлу,текЛист=1,Знач endCol=0) Экспорт
//OpenOffice Calc// Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice\LibreOffice не установлена на данном компьютере!"); Возврат Неопределено; КонецПопытки;
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства.Name = "AsTemplate"; Свойства.Value = Истина; Args = Новый COMSafeArray("VT_VARIANT", 2); Args.SetValue(0, Свойства); Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства1.Name = "Hidden"; Свойства1.Value = Истина; Args.SetValue(1,Свойства1); Попытка FileProvider=ServiceManager.createInstance("com.sun.star.ucb.FileContentProvider"); URL=FileProvider.getFileURLFromSystemPath("",ПутьКФайлу); Document = Desktop.LoadComponentFromURL(URL, "_blank", 0, Args); Исключение ServiceManager = Неопределено; КонецПопытки; Sheets = Document.getSheets(); Если Sheets.Count<текЛист Тогда Сообщить("Количество страниц в файле меньше, чем запрошено"); ServiceManager = Неопределено; Возврат Неопределено; КонецЕсли; Sheet = Sheets.getByIndex(текЛист-1); Курсор = Sheet.createCursor(); Курсор.gotoEndOfUsedArea(Истина); endCol = Курсор.Columns.Count - 1; endRow = Курсор.Rows.Count - 1; begCol = 0; begRow = 0; нКол = 0; локТабЗнач = Новый ТаблицаЗначений; локТабЗнач.Колонки.Очистить(); КС = Новый КвалификаторыСтроки(); Массив = Новый Массив; Массив.Добавить(Тип("Строка")); ОписаниеТиповСтрока = Новый ОписаниеТипов(Массив, , КС); Пока нКол <= endCol Цикл ИмяКол = "К"+Строка(нкол+1); локТабЗнач.Колонки.Добавить(ИмяКол,ОписаниеТиповСтрока); нКол = нКол + 1; КонецЦикла; Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow); МассивКом = Новый COMSafeArray("VT_VARIANT", Range.Columns.Count, Range.Rows.Count); МассивКом = Range.getDataArray(); тмпПростойМассив = МассивКом.Выгрузить(); Для каждого массив из тмпПростойМассив Цикл ит = 0; НовСтрока = локТабЗНач.Добавить(); Для каждого ЭлементМассива из массив цикл НовСтрока[ит] = ЭлементМассива; ит = ит + 1; КонецЦикла; КонецЦикла; Document.Close(True); Document = Неопределено;
Группа: Пользователи
Сообщений: 86
Спасибо сказали: 5 раз
Рейтинг: 5
alex_shkut @ Сегодня, 14:42
,
Я теж через OLE зробив, тільки простіше. Якщо при відкритті помилка, перезберегаю в офісі (Excel або OpenOffice якщо нема MS) та знова завантажую в ТабличныйДокумент.
Функция ПерезаписатьДокументExcel(ИмяФайла) Экспорт
Excel = Неопределено; OpenOffice = Неопределено;
Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение КонецПопытки;
Если Excel = Неопределено Тогда Попытка OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение КонецПопытки; КонецЕсли;
Если Excel <> Неопределено Тогда Попытка Книга = Excel.WorkBooks.Open(ИмяФайла); Excel.DisplayAlerts = 0; Excel.WorkBooks(1).Save(); Книга.Close(); Excel.Application.Quit(); Возврат Истина; Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); Excel.Application.Quit(); Возврат Ложь; КонецПопытки; КонецЕсли;
Если OpenOffice <> Неопределено Тогда Попытка 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");
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!