Загрузка документа в Excel. Формат файла не поддерживается
15.03.24, 7:59
Завсегдатай
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать("D:\Temp\123.xls" , СпособЧтенияЗначенийТабличногоДокумента.Значение);
Сохраняю на диск банковские выписки из "Приват24 для бизнеса".
При попытке загрузить в ТабличныйДокумент возникает ошибка:
Ошибка при выполнении файловой операции . Формат файла не поддерживается.
Открываю документ в Excel и сохранить его (после этого размер файла увеличивается).
После этого загрузка проходит нормально.
Как до так и после пересохранения формат файла не меняется (в заголовке символы "РПаЎ±б").
Ни версия платформы 1С, ни изменение расширения файла на это влияет.
Чтобы обойти эту проблему, перед чтением документа в табличный документ, запускаю Application.Excel, открываю его и пересохраняю.
Но если на пк не установлен Excel, то это уже не поможет.
Можно ли как-то это исправить?
Или есть ли какая-то утилита для или способ открытия/сохранения документа excel без установленного Excel?
15.03.24, 8:18
Почти ветеран
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 138.7
Slon747 @ Сегодня, 8:59
,
Обратиться в поддержку Приват...
Цитата(Slon747 @ 15.03.24, 8:59)
(после этого размер файла увеличивается)
Какой формат файла Excel?
Я можу зробити цю роботу: - Швидко - Якісно - ДешевоВиберіть 2 будь-які пункти
15.03.24, 8:53
Завсегдатай
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16
Цитата(AnryMc @ 15.03.24, 8:18)
Обратиться в поддержку Приват...
Не думаю, что поможет.
Это продолжается годами на разных ФОП и в офисных программах данный документ открывается без проблем.
Цитата(AnryMc @ 15.03.24, 8:18)
Какой формат файла Excel?
XLS
15.03.24, 9:46
Почти ветеран
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 138.7
Цитата(Slon747 @ 15.03.24, 8:59)
Или есть ли какая-то утилита для или способ открытия/сохранения документа excel без установленного Excel?
Такого не попадалось, но если в "Приват24 для бизнеса" есть выгрузка в другие форматы. например CSV, DBF или XML то есть вероятность найти конверторы
З.Ы. Хотя если есть XML - то в "потоке" он тоже читается
AnryMc @ Сегодня, 10:27
,
Кстати при чтение Табличного документа в "потоке" есть
ТипФайлаТабличногоДокумента
ANSITXT (ANSITXT)
DOCX (DOCX)
DOCX2010 (DOCX2010)
HTML (HTML)
HTML3 (HTML3)
HTML4 (HTML4)
HTML5 (HTML5)
MXL (MXL)
MXL7 (MXL7)
ODS (ODS)
PDF (PDF)
PDF_A_1 (PDF_A_1)
TXT (TXT)
XLS (XLS)
XLS95 (XLS95)
XLS97 (XLS97)
XLSX (XLSX)
XLSX2010 (XLSX2010)
Так что можно попробовать "поиграть" нижними вариантами...
Что-то типа
ТабличныйДокумент = Новый ТабличныйДокумент;
дд = Новый ДвоичныеДанные("D:\Temp\123.xls" );
ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);
Сообщение отредактировал AnryMc - 15.03.24, 9:52
Я можу зробити цю роботу: - Швидко - Якісно - ДешевоВиберіть 2 будь-які пункти
15.03.24, 9:55
Завсегдатай
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16
Цитата(AnryMc @ 15.03.24, 9:46)
Такого не попадалось, но если в "Приват24 для бизнеса" есть выгрузка в другие форматы. например CSV, DBF или XML то есть вероятность найти конверторы
С DBF проблем нет.
Кроме того даже есть API для получения данных через HTTP.
Но хотел решить проблемы с excel.
Цитата(AnryMc @ 15.03.24, 9:46)
Кстати при чтение Табличного документа в "потоке" есть ТипФайлаТабличногоДокумента
А как в потоке загружать данные в ТабличныйДокумент?
15.03.24, 10:06
Почти ветеран
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 138.7
Цитата(Slon747 @ 15.03.24, 10:55)
А как в потоке загружать данные в ТабличныйДокумент?
Цитата(AnryMc @ 15.03.24, 10:46)
Что-то типа ТабличныйДокумент = Новый ТабличныйДокумент; дд = Новый ДвоичныеДанные("D:\Temp\123.xls"); ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);
Я можу зробити цю роботу: - Швидко - Якісно - ДешевоВиберіть 2 будь-які пункти
15.03.24, 10:50
Живет на форуме
Группа: Местный
Сообщений: 2752
Из: Проскуров
Спасибо сказали: 709 раз
Рейтинг: 688.5
Цитата(AnryMc @ 15.03.24, 10:06)
Что-то типа ТабличныйДокумент = Новый ТабличныйДокумент; дд = Новый ДвоичныеДанные("D:\Temp\123.xls"); ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);
А сам поток где?
типа так
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток);
Поток.Закрыть();
Цитата(AnryMc @ 15.03.24, 9:46)
Кстати при чтение Табличного документа в "потоке" есть ТипФайлаТабличногоДокумента ANSITXT (ANSITXT) DOCX (DOCX) DOCX2010 (DOCX2010) HTML (HTML) HTML3 (HTML3) HTML4 (HTML4) HTML5 (HTML5) MXL (MXL) MXL7 (MXL7) ODS (ODS) PDF (PDF) PDF_A_1 (PDF_A_1) TXT (TXT) XLS (XLS) XLS95 (XLS95) XLS97 (XLS97) XLSX (XLSX) XLSX2010 (XLSX2010)
а откуда это взялось ?
из справки
Цитата
Описание варианта метода: Чтение табличного документа из потока. При чтении из потока допускается использование только следующих форматов: MXL, MXL7, ODS.
15.03.24, 10:59
Завсегдатай
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16
AnryMc @ Сегодня, 10:06
,
sava1 @ Сегодня, 10:50
,
Спасибо, не знал что можно читать из потока.
Но все равно не прочитал.
Значит, не судьба.
P.S. Кстати, документ excel можно открыть прямо из Предприятия (не знал).
И данный документ в нем тоже не открывается с такой же ошибкой.
19.03.24, 14:42
Общительный
Группа: Пользователи
Сообщений: 44
Из: Сумы
Спасибо сказали: 6 раз
Рейтинг: 0
Slon747 @ 15.03.24, 16:49
,
В напрямку LibreOffice не дивилися? Я усе через нього роблю.
Процедура ЗагрузитьИзФайла()
ТипФайла = 0 ;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Табличный документ(*.xls)|*.xls|Табличный документ(*.xlsx)|*.xlsx" ;
Если не Диалог.Выбрать() Тогда
Возврат ;
КонецЕсли ;
Если ДанныеФайла.Количество()>0 Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Текст = "ru = "" Табличная часть будет очищена, продолжить?"" ;"
+ " uk = "" Таблична частина буде очищена, продовжити?"" " ;
Ответ = Вопрос(НСтр(Текст), Режим, 0 );
КонецЕсли ;
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат ;
КонецЕсли ;
ТабЗн = Новый ТаблицаЗначений;
Попытка
ТабЗн.Прочитать(Диалог.ПолноеИмяФайла);
ТипФайла = 1 ;
Исключение
КонецПопытки ;
Если ТипФайла=0 Тогда
Попытка
ТабЗн=ОО.ЗагрузитьТЗизФайла(Диалог.ПолноеИмяФайла,1 );
ТипФайла = 2 ;
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не найдено подходящего приложения для загрузки файла" +Символы.ПС+ОписаниеОшибки();
Сообщение.Сообщить();
Возврат ;
КонецПопытки ;
КонецЕсли ;
ДанныеФайла.Очистить();
Шкут_Общий.ДополнитьКолонкиТаблицыЗначений(ДанныеФайла,ТабЗн);
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТабЗн,ДанныеФайла);
ДанныеФайла.Колонки.Добавить("Проект" ,Новый ОписаниеТипов("СправочникСсылка.Проекты" ));
ДанныеФайла.Колонки.Добавить("Счет" ,Новый ОписаниеТипов("ДокументСсылка.СчетНаОплатуПокупателю" ));
ДанныеФайла.Колонки.Добавить("Корр" ,Новый ОписаниеТипов("ДокументСсылка.КорректировкаДолга" ));
ЭлементыФормы.ДанныеФайла.СоздатьКолонки();
Для Каждого Колонка из ЭлементыФормы.ДанныеФайла.Колонки Цикл
Колонка.Ширина = 4 ;
КонецЦикла ;
КонецПроцедуры
Процедура КоманднаяПанель2ВосстановитьДаты(Кнопка)
Колонка = ЭлементыФормы.ДанныеФайла.ТекущаяКолонка;
Для Каждого Строка из ДанныеФайла Цикл
Если ЗначениеЗаполнено(Строка[Колонка.Имя]) Тогда
Попытка
Строка[Колонка.Имя] = Дата("19000101" )+((Строка[Колонка.Имя]-2 )*24 *60 *60 );
Исключение
КонецПопытки ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код загального модуля ОО:
функция ПривестиФайлКУРЛ(ПутьКФайлу)
ПутьКФайлу = СтрЗаменить(ПутьКФайлу," " ,"%20" );
ПутьКФайлу = СтрЗаменить(ПутьКФайлу,"\" ,"/" );
Возврат "file:/" + "/localhost/" + ПутьКФайлу;
Конецфункции
Функция ЗагрузитьТЗизФайла(ПутьКФайлу,текЛист=1,Знач endCol=0) Экспорт
Попытка
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 = Неопределено ;
ServiceManager = Неопределено ;
Возврат локТабЗнач;
КонецФункции
Процедура ВыгрузитьТЗвФайл(ТаблицаРезультата) Экспорт
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager" );
Исключение
Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!" );
Возврат ;
КонецПопытки ;
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop" );
Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue" );
Свойства.Name = "AsTemplate" ;
Свойства.Value = Истина ;
Args = Новый COMSafeArray("VT_VARIANT" , 3 );
Args.SetValue(0 , Свойства);
Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue" );
Свойства1 .Name = "Hidden" ;
Свойства1 .Value = Истина ;
Args.SetValue(1 , Свойства1 );
Document = Desktop.LoadComponentFromURL("private:factory/scalc" , "_blank" , 0 , Args);
Sheets = Document.getSheets();
Sheet = Sheets.getByIndex(0 );
мИтКол = 0 ;
Для каждого кол из ТаблицаРезультата.Колонки Цикл
Sheet.getCellByPosition(мИтКол,0 ).setString(кол.Имя);
мИтКол = мИтКол + 1 ;
КонецЦикла ;
ВсегоСтрок = ТаблицаРезультата.Количество();
ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();
МассивКОМ = Новый COMSafeArray("VT_VARIANT" , ВсегоСтрок,ВсегоКолонок);
иткол = 0 ;
итстр = 0 ;
Для каждого стр из ТаблицаРезультата Цикл
Для каждого кол из ТаблицаРезультата.Колонки Цикл
стрРез = СокрЛП(стр[кол.Имя]);
МассивКОМ.SetValue(итстр,иткол,стрРез);
иткол = иткол+1 ;
КонецЦикла ;
иткол = 0 ;
итстр = ?(итстр=ВсегоСтрок,0 ,итстр+1 );
КонецЦикла ;
begCol = 0 ;
begRow = 1 ;
endCol = ВсегоКолонок-1 ;
endRow = ВсегоСтрок;
Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
Range.setDataArray(МассивКОМ);
Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue" );
Свойства2 .Name = "FilterName" ;
Свойства2 .Value = "MS Excel 97" ;
Args.SetValue(2 ,Свойства2 );
Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина );
КонецПроцедуры
І код з мого власного модуля:
Процедура ДополнитьКолонкиТаблицыЗначений(ТаблицаБазовая,ТаблицаДополнений) Экспорт
Для каждого Колонка из ТаблицаДополнений.Колонки Цикл
Если Не (ТаблицаБазовая.Колонки.Найти(Колонка.Имя) = Неопределено ) тогда
Продолжить;
КонецЕсли ;
ТаблицаБазовая.Колонки.Добавить(Колонка.Имя,Колонка.ТипЗначения,Колонка.Заголовок,Колонка.Ширина);
КонецЦикла ;
КонецПроцедуры
19.03.24, 15:46
Завсегдатай
Группа: Пользователи
Сообщений: 121
Спасибо сказали: 16 раз
Рейтинг: 16
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" );
Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop" );
URL = ConvertToURL(ИмяФайла);
Doc = Desktop.LoadComponentFromURL(URL, "_blank" , 0 , MassivParametrov);
Doc.lockControllers();
Doc.addActionLock();
Sheets = Doc.GetSheets();
Лист = Sheets.GetByIndex(0 );
Doc.store();
Doc.close(Истина );
Desktop.terminate();
Возврат Истина ;
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки ;
КонецЕсли ;
Возврат Ложь ;
КонецФункции
Функция ConvertToURL(FileName)
ИмяФайла = СтрЗаменить(FileName, " " , "%20" );
ИмяФайла = СтрЗаменить(ИмяФайла, "\" , "/" );
Возврат "file://localhost/" + ИмяФайла;
КонецФункции
Не нашли ответа на свой вопрос?
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!