Страница 1 из 1

Быстрый экспорт больших отчетов в MS Word

Добавлено: 20 янв 2011, 18:14
Disillusioned
Экспорт отчетов большого объема в MS Word занимает много времени. В особо тяжелых случаях >10 минут.
Сами понимаете - 10 минут - это никуда не годится...
Нашли способ ускорить этот процесс в ~50 раз.
В двух словах (куски кода приведены для иллюстрации подхода):
1. Сохраняем отчет в виде html файла

Код: Выделить всё

hhh=LsRpt.SaveAs(name_html,"HTMLTable",false)
2. Слегка редактируем текст html (добавлем тэг с указанием кодировки и чистим лишнее в области заголовка таблицы).

Код: Выделить всё

Set File = file_system.GetFile(name_html)
Set TextStream = File.OpenAsTextStream(1)
Text=TextStream.ReadAll()
TextStream.Close
'текст html, вплоть до описания заголовка первого столбца "№" заменяем на нужный нам
pos_st=InStr(1,text,"<TH>№") 
text = "<title>Lotsia PDM Plus</title> "+_
          "<meta http-equiv="""Content-Type""" content="""text/html; charset=windows-1251"""> "+_
          "<TABLE border=1 cellspacing=-1> "+_
          "<TR> "+_
           mid(text,pos_st)
Set TextStream = File.OpenAsTextStream(2)
TextStream.WriteLine line
TextStream.WriteLine Text
TextStream.Save
TextStream.Close
3. Вставляем html файл в Word

Код: Выделить всё

AcDoc.Range.InsertFile(name_html)
4. Форматируем вставленную таблицу (ширина столбцов, шрифт заголовков.....)

Код: Выделить всё

         AcDoc.Sections(1).Range.Tables(1).Rows.LeftIndent = -4
         AcDoc.Sections(1).Range.Tables(1).Rows.AllowBreakAcrossPages = False
         AcDoc.Sections(1).Range.Tables(1).AllowAutoFit = False
         AcDoc.Sections(1).Range.Tables(1).PreferredWidthType = 1
         AcDoc.Sections(1).Range.Tables(1).PreferredWidth=0
         AcDoc.Sections(1).Range.Tables(1).Cell(1,7).Range.Text="Разд."
         AcDoc.Sections(1).Range.Tables(1).Rows(1).HeadingFormat = True
         AcDoc.Sections(1).Range.Tables(1).Columns(1).PreferredWidthType = 3
         AcDoc.Sections(1).Range.Tables(1).Columns(1).PreferredWidth = 34
         AcDoc.Sections(1).Range.Tables(1).Columns(2).PreferredWidthType = 3
         AcDoc.Sections(1).Range.Tables(1).Columns(2).PreferredWidth = 39
         AcDoc.Sections(1).Range.Tables(1).Columns(3).PreferredWidthType = 3
         AcDoc.Sections(1).Range.Tables(1).Columns(3).PreferredWidth = 88
         AcDoc.Sections(1).Range.Tables(1).Columns(4).PreferredWidthType = 3
P/S Полагаю, что этот метод подойдет не для всякого отчета, но для простых таблиц сойдет вполне.