Задача:
множество десятков файлов в формате 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; выдавалось окно с предупреждением при сохранении, текст окна не помню так как нажал -больше не показывать- может кто знает как его отключить без участия пользователя