Poli1964 utworzono 28 września 2015 utworzono 28 września 2015 Witam, jestem w trakcie pisania programu do tworzenia faktur i napotkałem na problem. Poniżej prezentuje kod który zapisuje tabele na podstawie DataGridView do pliku word. public void Export_Data_To_Word(DataGridView DGV, string filename) { if (DGV.Rows.Count != 0) { int RowCount = DGV.Rows.Count; int ColumnCount = DGV.Columns.Count; Object[,] DataArray = new object[RowCount + 1, ColumnCount + 1]; //add rows int r = 0; for (int c = 0; c <= ColumnCount - 1; c++) { for (r = 0; r <= RowCount - 1; r++) { DataArray[r, c] = DGV.Rows[r].Cells[c].Value; } //end row loop } //end column loop Word.Document oDoc = new Word.Document(); oDoc.Application.Visible = true; //page orintation oDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientPortrait; oDoc.PageSetup.TopMargin = 500; dynamic oRange = oDoc.Content.Application.Selection.Range; string oTemp = ""; for (r = 0; r <= RowCount - 1; r++) { for (int c = 0; c <= ColumnCount - 1; c++) { oTemp = oTemp + DataArray[r, c] + "\t"; } } //table format oRange.Text = oTemp; object Separator = Word.WdTableFieldSeparator.wdSeparateByTabs; object ApplyBorders = true; object AutoFit = true; object AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitContent; oRange.ConvertToTable(ref Separator, ref RowCount, ref ColumnCount, Type.Missing, Type.Missing, ref ApplyBorders, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, ref AutoFit, ref AutoFitBehavior, Type.Missing); oRange.Select(); oDoc.Application.Selection.Tables[1].Select(); oDoc.Application.Selection.Tables[1].Rows.AllowBreakAcrossPages = 0; oDoc.Application.Selection.Tables[1].Rows.Alignment = 0; oDoc.Application.Selection.Tables[1].Rows[1].Select(); oDoc.Application.Selection.InsertRowsAbove(1); oDoc.Application.Selection.Tables[1].Rows[1].Select(); ////header row style oDoc.Application.Selection.Tables[1].Rows[1].Range.Bold = 1; oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Name = "Tahoma"; oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Size = 14; //add header row manually for (int c = 0; c <= ColumnCount - 1; c++) { oDoc.Application.Selection.Tables[1].Cell(1, c + 1).Range.Text = DGV.Columns[c].HeaderText; } //table style oDoc.Application.Selection.Tables[1].set_Style("Grid Table 4 - Accent 5"); oDoc.Application.Selection.Tables[1].Rows[1].Select(); oDoc.Application.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; private void button1_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Word Documents (*.docx)|*.docx"; sfd.FileName = "Cexport.docx"; if (sfd.ShowDialog() == DialogResult.OK) { Export_Data_To_Word(dataGridView1, sfd.FileName); } Problem polega na tym ze za pomocą tego kodu za każdym razem tworzymy nowy plik natomiast zależy mi na tym aby ta tabelka była dodawana do istniejącego pliku word w którym mam już zrobiony pewien schemat danych potrzebnych do faktury. Proszę o pomoc.
rafalluz komentarz 28 września 2015 komentarz 28 września 2015 Wklej całą funkcję Export_Data_To_Word, bo jest ucięta i nie ma fragmentu, który realizuje sam zapis do pliku.
Poli1964 komentarz 30 września 2015 Autor komentarz 30 września 2015 public void Export_Data_To_Word(DataGridView DGV, string filename) { if(File.Exists(filename)) { if (DGV.Rows.Count != 0) { int RowCount = DGV.Rows.Count; int ColumnCount = DGV.Columns.Count; Object[,] DataArray = new object[RowCount + 1, ColumnCount + 1]; //add rows int r = 0; for (int c = 0; c <= ColumnCount - 1; c++) { for (r = 0; r <= RowCount - 1; r++) { DataArray[r, c] = DGV.Rows[r].Cells[c].Value; } //end row loop } //end column loop object missing = System.Reflection.Missing.Value; Word.Document oDoc = new Word.Document(); Word.Application wordApp = new Word.Application(); oDoc = wordApp.Documents.Open(filename); oDoc.Activate(); oDoc.Application.Visible = true; //page orintation oDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientPortrait; dynamic oRange = oDoc.Content.Application.Selection.Range; string oTemp = ""; for (r = 0; r <= RowCount - 1; r++) { for (int c = 0; c <= ColumnCount - 1; c++) { oTemp = oTemp + DataArray[r, c] + "\t"; } } //table format oRange.Text = oTemp; object Separator = Word.WdTableFieldSeparator.wdSeparateByTabs; object ApplyBorders = true; object AutoFit = true; object AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitContent; oRange.ConvertToTable(ref Separator, ref RowCount, ref ColumnCount, Type.Missing, Type.Missing, ref ApplyBorders, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, ref AutoFit, ref AutoFitBehavior, Type.Missing); oRange.Select(); oDoc.Application.Selection.Tables[1].Select(); oDoc.Application.Selection.Tables[1].Rows.AllowBreakAcrossPages = 0; oDoc.Application.Selection.Tables[1].Rows.Alignment = 0; oDoc.Application.Selection.Tables[1].Rows[1].Select(); oDoc.Application.Selection.InsertRowsAbove(1); oDoc.Application.Selection.Tables[1].Rows[1].Select(); ////header row style oDoc.Application.Selection.Tables[1].Rows[1].Range.Bold = 1; oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Name = "Tahoma"; oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Size = 14; //add header row manually for (int c = 0; c <= ColumnCount - 1; c++) { oDoc.Application.Selection.Tables[1].Cell(1, c + 1).Range.Text = DGV.Columns[c].HeaderText; } //table style oDoc.Application.Selection.Tables[1].set_Style("Grid Table 4 - Accent 5"); oDoc.Application.Selection.Tables[1].Rows[1].Select(); oDoc.Application.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; //header text //foreach (Word.Section section in oDoc.Application.ActiveDocument.Sections) //{ // Word.Range headerRange = section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; // headerRange.Fields.Add(headerRange, Word.WdFieldType.wdFieldPage); // headerRange.Text = "your header text"; // headerRange.Font.Size = 16; // headerRange.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; //} //save the file //oDoc.SaveAs2(filename); } } else { MessageBox.Show("Plik nie istnieje !"); } } private void button1_Click(object sender, EventArgs e) { Export_Data_To_Word(dataGridView1, @"C:\Users\Piter\Desktop\WZORTEST.docx"); } Oto cały kod. Problem udało mi się rozwiązać za pomocą : Word.Application wordApp = new Word.Application(); oDoc = wordApp.Documents.Open(filename); oDoc.Activate(); natomiast teraz napotkałem następny problem. Czy da się w jakiś sposób ustawić odpowiednie położenie tej tabeli utworzonej na podstawie DataGridView ? Próbowałem za pomocą : oDoc.PageSetup.TopMargin lecz niestety tworzy się górny margines i wszystkie dane jakie mam wpisane w schemacie przesuwają się w dół.
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.