




Посмотрите "Word Automation".
Например, KB316384, который охватывает:
Пример кода в этой статье демонстрирует, как сделать следующее:
Спасибо. Но я ищу решение, которое использует .NET Reference вместо COM-ссылки. Много искал, но не нашел. Может ли кто-нибудь?
Если вы не хотите использовать Word Automation, например у вас не установлен Word на компьютере, на котором запущена ваша программа, вам следует взглянуть на Aspose.Words.
Проблема только в том, что это не бесплатно.
Word с радостью откроет файл в формате HTML с расширением .Doc. Вы можете получить любое желаемое форматирование, используя внутреннюю таблицу стилей. Здесь возник очень похожий вопрос:
Вот код для копирования datagridview в таблицу слов:
Ссылка - Microsoft.Office.Interop.Word. C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Office12 \ Microsoft.Office.Interop.Word.dll
using word = Microsoft.Office.Interop.Word;
public static void ExportToWord(DataGridView dgv)
{
SendMessage("Opening Word");
word.ApplicationClass word = null;
word.Document doc = null;
object oMissing = System.Reflection.Missing.Value;
object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */
try
{
word = new word.ApplicationClass();
word.Visible = true;
doc = word.Documents.Add(ref oMissing, ref oMissing,ref oMissing, ref oMissing);
}
catch (Exception ex)
{
ErrorLog(ex);
}
finally
{
}
if (word != null && doc != null)
{
word.Table newTable;
word.Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
newTable = doc.Tables.Add(wrdRng, 1, dgv.Columns.Count-1, ref oMissing, ref oMissing);
newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
newTable.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
newTable.AllowAutoFit = true;
foreach (DataGridViewCell cell in dgv.Rows[0].Cells)
{
newTable.Cell(newTable.Rows.Count, cell.ColumnIndex).Range.Text = dgv.Columns[cell.ColumnIndex].Name;
}
newTable.Rows.Add();
foreach (DataGridViewRow row in dgv.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
newTable.Cell(newTable.Rows.Count, cell.ColumnIndex).Range.Text = cell.Value.ToString();
}
newTable.Rows.Add();
}
}
}
Вы можете попробовать мой метод экспорта данных в Word (* .docx), он прост в использовании и работает на 100% с любым DataGridView, просто добавьте ссылку Microsoft.Office.Interop.Word и скопируйте следующий код:
using Word = Microsoft.Office.Interop.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.wdOrientLandscape;
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);
//NASSIM LOUCHANI
}
}
private void button_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Word Documents (*.docx)|*.docx";
sfd.FileName = "export.docx";
if (sfd.ShowDialog() == DialogResult.OK)
{
Export_Data_To_Word(dataGridView1, sfd.FileName);
}
}
Спасибо.
У меня есть код для вставки таблицы в конкретную модель извлечения закладок в базе данных, я надеюсь, что это поможет сообществу, я использую mvc C#, слово взаимодействия Microsoft Office для создания файла Word и добавления динамической таблицы из вспомогательного класса
public void tableFromDatabase(Document doc, Application word, string risk, string bookmarkName, TableTemplate table) {
Table newTable;//Create a new table
Range wrdRng = doc.Bookmarks.get_Item(bookmarkName).Range;//Get a bookmark Range
doc.Bookmarks[bookmarkName].Select();
newTable = word.Selection.Tables.Add(wrdRng,1,1);//Add new table to selected bookmark by default set 1 row, 1 column (need set interval 1-63)
newTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
int a=0, b=0;//Set integer values for iterate in model arrays
//Iterate model rows
for (int i = 1; i <= table.Rows.Count; i++)//Set in 1 the value because in word tables the begin is (1,1)
{
//Only add rows if is after first row
if (i > 1)
{
newTable.Rows.Add();
}
//Iterate model columns from rows
for (int j = 1; j <= table.Rows[a].Columns.Count; j++)
{
//Only Add rows if is after first
if (j == 1 && i == 1)
{
newTable.Cell(i, j).Range.Font.Name = table.Rows[a].Columns[b].cellFontName;
newTable.Cell(i, j).Range.Font.Size = table.Rows[a].Columns[b].cellFontSize;
newTable.Cell(i, j).Width = float.Parse(table.Rows[a].Columns[b].cellWidth);
}
else
{
//Add Cells to rows only if columns of the model is largen than table, this is for not exceed the interval
if (newTable.Rows[i].Cells.Count < table.Rows[a].Columns.Count)
{
newTable.Rows[i].Cells.Add();
}
//Set the values to new table
//The width must be float type
newTable.Cell(i, j).Range.Font.Name = table.Rows[a].Columns[b].cellFontName;
newTable.Cell(i, j).Range.Font.Size = table.Rows[a].Columns[b].cellFontSize;
newTable.Cell(i, j).Width = float.Parse(table.Rows[a].Columns[b].cellWidth);
}
b++;
//Set 0 to reset cycle
if (b == table.Rows[a].Columns.Count)
{
b = 0;
}
}
a++;
//Set 0 to reset cycle
if (a == table.Rows.Count)
{
a = 0;
}
}
newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
newTable.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
newTable.AllowAutoFit = true;
//Set gray color to borders
newTable.Borders.InsideColor = (Microsoft.Office.Interop.Word.WdColor)12964311;
newTable.Borders.OutsideColor = (Microsoft.Office.Interop.Word.WdColor)12964311;
}
(оставьте свой комментарий) Мне неприятно говорить вам об этом, но Word не является управляемым приложением. Итак, чтобы использовать само приложение Word, вам придется использовать COM api ... Альтернативой является использование стороннего инструмента для написания файлов Word напрямую (проще с .docx, чем .doc).