Показать сообщение отдельно
  #1  
Старый 30.05.2021, 11:16
BasicRunEr BasicRunEr вне форума
Прохожий
 
Регистрация: 30.05.2021
Сообщения: 2
Версия Delphi: Delphi Asm
Репутация: 10
По умолчанию Преобразование Ods в DocX

Задача:
множество десятков файлов в формате Ods (в книгах только один лист) преобразовать в формат DocX

Идея:
Чтобы не изучать внутреннее устройство форматов использовать OLE и установленный MSOffice 2016

Решение: (частично работает)
Код:
...
  MyExcel.WorkBooks[1].WorkSheets[1].Cells.Select; //выделяем все ячейки
  MyExcel.Selection.Copy; //копируем
  
  MyWord.Documents.Add; //создаем документ Word
  MyWord.Selection.Paste; //вставляем ранее выделенное
 MyWord.ActiveDocument.SaveAs(CrDir+'\'+searchresult.Name+'.docx');//сохраняем в формате docx
...

Проблемы:
1. На тестовом файле работает на реальных зависает
2. В ячейках таблицы полученной в DocX длинные цифры не помещаясь записаны в две строки, а таблица может выйти за границы листа (в исходном ods такого нет)

Выявлено:
при использовании UsedRange.Rows.Count на реальных файлах выдается что используется порядка 80000 строк, хотя строк с данными от 25 до 200.
процесс Word при выполнении кода использует до 1,5 Гб памяти и долгое ожидание не дает результата
использование UsedRange.ClearFormats помогает избавиться от пустых ячеек и преобразование происходит однако вид таблиц в DocX становится совсем не читаемым

Эксперимент:
При сохранении файлов ods из Excel в формате pdf , открытие его в Word и новом сохранении в формате DocX дает прекрасные файлы с хорошо читаемыми таблицами и возможностью их редактировать
Решено сделать так ods->pdf->docx

Решение: (костыль! пока отлично работает)
Код:
...
   MyExcel.Workbooks.Open(CrDir+'\'+searchresult.Name);// открываем файл ods
 
  MyExcel.DisplayAlerts:=False; //отключаем предупреждения Excel
  MyWord.DisplayAlerts:=False; //отключаем предупреждения Word

MyExcel.WorkBooks[1].ExportAsFixedFormat(0, CrDir+'\'+searchresult.Name+'.pdf', EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); //сохраняем из Excel в pdf формате

MyWord.Documents.Open(CrDir+'\'+searchresult.Name+'.pdf');// открываем сохранение pdf в Word
MyWord.ActiveDocument.SaveAs(CrDir+'\'+searchresult.Name+'.docx');// сохраняем в docx
...

Вопросы:
1. Как избавится от пустых строк которые считаются используемыми
2. Есть ли идея другого варианта преобразования
3. Даже при MyWord.DisplayAlerts:=False; выдавалось окно с предупреждением при сохранении, текст окна не помню так как нажал -больше не показывать- может кто знает как его отключить без участия пользователя
Ответить с цитированием