ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать("D:\Temp\123.xls", СпособЧтенияЗначенийТабличногоДокумента.Значение);
Slon747 @ Сегодня, 8:59
,
Обратиться в поддержку Приват...
ТабличныйДокумент = Новый ТабличныйДокумент;
дд = Новый ДвоичныеДанные("D:\Temp\123.xls");
ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток);
Поток.Закрыть();
AnryMc @ Сегодня, 10:06
,
sava1 @ Сегодня, 10:50
,
Спасибо, не знал что можно читать из потока.
Но все равно не прочитал.
Значит, не судьба.
P.S. Кстати, документ excel можно открыть прямо из Предприятия (не знал).
И данный документ в нем тоже не открывается с такой же ошибкой.
Slon747,
там скорее действительно не играет формат - бывало такое.
юзайте другой вариант
а якщо спробувати перейменовувати(копыювати) файл, а потым выдкривати ы считувати
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);
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
функция ПривестиФайлКУРЛ(ПутьКФайлу)
ПутьКФайлу = СтрЗаменить(ПутьКФайлу," ","%20");
ПутьКФайлу = СтрЗаменить(ПутьКФайлу,"\","/");
Возврат "file:/" + "/localhost/" + ПутьКФайлу;
Конецфункции
Функция ЗагрузитьТЗизФайла(ПутьКФайлу,текЛист=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 = Неопределено;
ServiceManager = Неопределено;
Возврат локТабЗнач;
КонецФункции
Процедура ВыгрузитьТЗвФайл(ТаблицаРезультата) Экспорт
//OpenOffice Calc///////////////////////////////////////////////////////////////////////////
Попытка
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(МассивКОМ);
//Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args);
Свойства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(Истина);
//Document.storeToURL(ПривестиФайлКУРЛ(ФайлКартотеки),Args);
КонецПроцедуры
Процедура ДополнитьКолонкиТаблицыЗначений(ТаблицаБазовая,ТаблицаДополнений) Экспорт
Для каждого Колонка из ТаблицаДополнений.Колонки Цикл
Если Не(ТаблицаБазовая.Колонки.Найти(Колонка.Имя) = Неопределено) тогда
//Колонка уже есть
Продолжить;
КонецЕсли;
ТаблицаБазовая.Колонки.Добавить(Колонка.Имя,Колонка.ТипЗначения,Колонка.Заголовок,Колонка.Ширина);
КонецЦикла;
КонецПроцедуры
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"); // Создаем 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С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua