Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2015, 05:43   #1
ZaraZoV
Пользователь
 
Регистрация: 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);
}
ZaraZoV вне форума Ответить с цитированием
Старый 13.08.2015, 05:00   #2
ZaraZoV
Пользователь
 
Регистрация: 05.08.2015
Сообщений: 14
По умолчанию

Не ужели никто не сталкивался. Хелп плиз.
ZaraZoV вне форума Ответить с цитированием
Старый 13.08.2015, 13:02   #3
ZaraZoV
Пользователь
 
Регистрация: 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();
}
ZaraZoV вне форума Ответить с цитированием
Старый 13.08.2015, 13:02   #4
ZaraZoV
Пользователь
 
Регистрация: 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;


}
}
}
ZaraZoV вне форума Ответить с цитированием
Старый 13.08.2015, 13:43   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Не рассматривали переход на docx? Можно будет пользовать всякие такие штуки: https://msdn.microsoft.com/ru-ru/lib.../cc850835.aspx
они работают потенциально быстрее этой комовской офисной шляпы.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт данных в 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