我有一个C#应用程序,想要为一个程序实现逻辑,该程序将打开Word文档并转到页面上的某个位置,创建一个表格并在其中放置值。请问如何实现这一点?我正在使用Visual Studio 2005。
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();
}
}
}
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 Interop Word来创建Word文件,并从Helper类添加动态表格。
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;
}