|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.08.2015, 05:43 | #1 |
Пользователь
Регистрация: 05.08.2015
Сообщений: 14
|
Экспорт данных в таблицу Word документа.
Добрый день, ввожу данные в DataGridView из Access файла. Потом пытаюсь эти данные из DataGridView вывести в таблицу. Все получается, но очень долго. 500 строк, 12 столбцов выводится где-то минут 5. Заполняю построчно. Может есть способ заполнять таблицу в ворде не построчно а целиком копировать. Вот код как я заполняю.
Заранее спасибо за Ваше терпение и понимание. =) object oEndOfDoc = "\\endofdoc"; object oMissing = System.Reflection.Missing.Value; FileInfo fn = new FileInfo("e.doc"); //Копируем файл образца string _filename = Data.SelectedProject + ".doc"; string _dir_filename = (Environment.CurrentDirectory + "\\" + savedir + "\\" + _filename); fn.CopyTo(_dir_filename, true); //копируем в папку savedir //Создаём новый Word.Application Microsoft.Office.Interop.Word.Appli cation app = new Microsoft.Office.Interop.Word.Appli cation(); //Загружаем документ Microsoft.Office.Interop.Word.Docum ent doc = null; object fileName = _dir_filename; object falseValue = false; object trueValue = false; object missing = Type.Missing; doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); //Указываем таблицу в которую будем помещать данные (таблица должна существовать в шаблоне документа!) Microsoft.Office.Interop.Word.Table tbl = app.ActiveDocument.Tables[1]; Object start = 451; Object end = 451; Word.Range wordrange = doc.Range(ref start, ref end); Object defaultTableBehavior = Word.WdDefaultTableBehavior.wdWord9 TableBehavior; Object autoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitWin dow; //Добавляем таблицу и получаем объект wordtable Word.Table wordtable = doc.Tables.Add(wordrange, (dataGridView1.RowCount), 12, ref defaultTableBehavior, ref autoFitBehavior); try { for (int i = 1; i < (dataGridView1.RowCount - 1); i++) { wordtable.Cell(i, 1).Range.Text = dataGridView1.Rows[i].Cells[1].Value.ToString() +". " + dataGridView1.Rows[i].Cells[14].Value.ToString(); wordtable.Cell(i, 2).Range.Text = dataGridView1.Rows[i].Cells[2].Value.ToString() + "/" + dataGridView1.Rows[i].Cells[3].Value.ToString(); wordtable.Cell(i, 3).Range.Text = dataGridView1.Rows[i].Cells[19].Value.ToString(); wordtable.Cell(i, 4).Range.Text = dataGridView1.Rows[i].Cells[17].Value.ToString(); wordtable.Cell(i, 5).Range.Text = dataGridView1.Rows[i].Cells[15].Value.ToString(); wordtable.Cell(i, 6).Range.Text = "---"; wordtable.Cell(i, 7).Range.Text = dataGridView1.Rows[i].Cells[11].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[18].Value.ToString(); wordtable.Cell(i, 8).Range.Text = dataGridView1.Rows[i].Cells[10].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[9].Value.ToString(); wordtable.Cell(i, 8).Range.Text = dataGridView1.Rows[i].Cells[12].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[6].Value.ToString(); wordtable.Cell(i, 10).Range.Text = dataGridView1.Rows[i].Cells[13].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[7].Value.ToString(); wordtable.Cell(i, 11).Range.Text = dataGridView1.Rows[i].Cells[17].Value.ToString(); wordtable.Cell(i, 12).Range.Text = dataGridView1.Rows[i].Cells[18].Value.ToString(); } } catch (Exception e1) { MessageBox.Show(e1.Message); } |
13.08.2015, 05:00 | #2 |
Пользователь
Регистрация: 05.08.2015
Сообщений: 14
|
Не ужели никто не сталкивался. Хелп плиз.
|
13.08.2015, 13:02 | #3 |
Пользователь
Регистрация: 05.08.2015
Сообщений: 14
|
В общем решил проблему так. Отправлял таблицу в виде строки, значения разделял определенным символом. Потом в документе word выделял эту строку и создавал таблицу командой creat table. Так получается намного быстрее. Вот код. Если что не так прошу поправить.
using Word = Microsoft.Office.Interop.Word; using System.Data.OleDb; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private Word.Paragraphs wordparagraphs; private Word.Paragraph wordparagraph; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Подключаемся к базе. OleDbConnection connection = new OleDbConnection("Provider=Microsoft .Jet.OleDb.4.0;" + "Data Source=N.mdb"); OleDbCommand command = connection.CreateCommand(); // создать команду запроса //Создаем запрос на получение данных из базы command.CommandText = "SELECT t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12 FROM [table1]"; //Выборка элементов из базы //Считываем данные в reader connection.Open(); OleDbDataReader reader1 = command.ExecuteReader(); //Заполняемс строку st данными из таблицы, разделяем значения & string st = ""; while (reader1.Read()) { st = st + (reader1.GetString(0) + "&" + reader1.GetString(1) + "&" + reader1.GetString(2) + "&" + reader1.GetString(3) + "&" + reader1.GetString(4) + "&" + reader1.GetString(5) + "&" + reader1.GetString(6) + "&" + reader1.GetString(7) + "&" + reader1.GetString(8) + "&" + reader1.GetString(9) + "&" + reader1.GetString(10) + "&" + reader1.GetString(11) + "&"); } //Создаем отчет документа. object oMissing = System.Reflection.Missing.Value; //Значение по умолчание object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */ //Start Word and create a new document. Word.Application wordapp = new Word.Application(); Word.Document worddocument = wordapp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing); Object template = @"C:\template.doc"; //файл шаблона Object newTemplate = false; Object documentType = Word.WdNewDocumentType.wdNewBlankDo cument; Object visible = true; //Создаем документ 2 worddocument в данном случае создаваемый объект worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); //Активируем документ №2 worddocument = (Word.Document)wordapp.Documents.ge t_Item(2); worddocument.Activate(); //Получаем ссылки на параграфы документа wordparagraphs = worddocument.Paragraphs; //Будем работать с первым параграфом wordparagraph = (Word.Paragraph)wordparagraphs[1]; //Выводим текст в первый параграф wordparagraph.Range.Text = st; //Выделяем вставленную строку в документе Object begin = Type.Missing; object end = Type.Missing; Word.Range wordrange = worddocument.Range(ref begin, ref end); wordrange.Select(); } |
13.08.2015, 13:02 | #4 |
Пользователь
Регистрация: 05.08.2015
Сообщений: 14
|
//Задаем параметры создания таблицы
object Separator = "&"; //Разделитель столбцов строки object Format = Word.WdTableFormat.wdTableFormatNon e; object ApplyBorders = true; object AutoFit = true; object AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitCon tent; object missing = System.Reflection.Missing.Value; Object NumRows = 12; //Количество столбцов //Создаем таблицу путем конвертирования строки в таблицу. Word.Table Table1 = wordrange.ConvertToTable(ref Separator, ref missing, ref NumRows, ref missing, Format, ref ApplyBorders, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref AutoFit, ref AutoFitBehavior, ref missing); //Задаем стиль полей таблицы, почему та таблица создается без границ изначально Word.Table wordtable1 = worddocument.Tables[1]; wordtable1.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle; wordtable1.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleSingle; //Выделяем двенадцатый столбец. wordtable1.Columns[12].Select(); object unit; object extend; //Задаем параметры Selection, выделяем оставшиеся столбцы unit = Word.WdUnits.wdLine; extend = Word.WdMovementType.wdExtend; for (int ii = 1; ii <= 11; ii++) wordapp.Selection.HomeKey(ref unit, ref extend); //Двигаем выделение в лево 11 раз. по кол-ву столбцов. wordapp.Selection.Copy(); //Копируем выделенную таблицу. //Делаем активным второй документ. worddocument = (Word.Document)wordapp.Documents.ge t_Item(1); worddocument.Activate(); //Вставляем скопированную таблицу в место закладки sudakladi worddocument.Bookmarks["sudakladi"].Range.Paste(); //Делаем активным первый документ, и закрываем его. worddocument = (Word.Document)wordapp.Documents.ge t_Item(2); worddocument.Close(Word.WdSaveOptio ns.wdDoNotSaveChanges, Word.WdOriginalFormat.wdWordDocumen t, false); //Делаем таблицу видимой wordapp.Visible = true; } } } |
13.08.2015, 13:43 | #5 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Не рассматривали переход на docx? Можно будет пользовать всякие такие штуки: https://msdn.microsoft.com/ru-ru/lib.../cc850835.aspx
они работают потенциально быстрее этой комовской офисной шляпы. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Экспорт данных в MS Word | kakawkin | Общие вопросы Delphi | 0 | 26.05.2011 08:28 |
экспорт из Stringgrid в таблицу шаблона документа | Максон11 | Помощь студентам | 2 | 14.04.2011 09:47 |
Экспорт массива в таблицу Word | Smerch66 | Общие вопросы Delphi | 1 | 30.01.2011 10:46 |
Экспорт значений из нескольких документов Word в одну таблицу Excel для дальнейших расчетов. | YJYNGK | Microsoft Office Excel | 0 | 30.10.2010 13:42 |
открыть документ редактора Word, в конец документа добавить таблицу 10*10, | goldlider | Общие вопросы Delphi | 0 | 23.06.2010 21:03 |