GridView
ASP.NetをWord文書にエクスポートするための2つの異なるアプローチを考えることができます。
最初のアプローチでは、GridView
コントロールのHTMLをメモリストリームにレンダリングしてから、openxmlaltChunk
要素を使用して生成されたHTMLをワードドキュメントにインポートします。つまり、altChunk
マークアップ要素は、コンテンツ(HTMLなど)をドキュメントにインポートするようにMSWordに指示します。例については、次のコードを参照してください。
...
var p = new Paragraph(new ParagraphProperties(
new Justification() { Val = JustificationValues.Center }),
new Run(new Text("Some Text")));
body.Append(p);
mainPart.Document.Append(body);
// Add table to word document using alt chunk element.
AddTableUsingAltChunk(gv, mainPart);
...
public static void AddTableUsingAltChunk(GridView gv, MainDocumentPart mainPart)
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms, Encoding.UTF8);
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
gv.RenderControl(htw); // Render HTML of GridView
htw.Flush();
string altChunkId = "myChunkId";
// Create alternative format import part.
AlternativeFormatImportPart formatImportPart =
mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.Xhtml, altChunkId);
ms.Seek(0, SeekOrigin.Begin);
// Feed HTML data into format import part (chunk).
formatImportPart.FeedData(ms);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
// Append chunk.
mainPart.Document.Body.Append(altChunk);
}
}
2番目のアプローチはより複雑です。openxml SDKが提供するクラスを使用して、テーブルを作成します。詳細については、次のコードとインラインコメントを参照してください。
var dt = FunctionThatReturnDataTable(id)
...
var p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(
new DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties(
new Justification() { Val = JustificationValues.Center }),
new DocumentFormat.OpenXml.Wordprocessing.Run(new Text("Some Text")));
body.Append(p);
mainPart.Document.Append(body);
mainPart.Document.Body.Append(CreateTable(dt));
...
// Creates an open xml table from the provided data table.
public static Table CreateTable(System.Data.DataTable dt)
{
Table table = new Table();
TableProperties tableProperties = new TableProperties();
TableStyle tableStyle = new TableStyle() { Val = "MyStyle" };
TableWidth tableWidth = new TableWidth()
{
Width = "0",
Type = TableWidthUnitValues.Auto
};
TableLook tableLook = new TableLook() { Val = "04A0" };
tableProperties.Append(tableStyle);
tableProperties.Append(tableWidth);
tableProperties.Append(tableLook);
TableGrid tableGrid = new TableGrid();
// Calculate column width in twentieths of a point (same width for every column).
// 595=A4 paper width in points.
int colWidth = (int)((595 / (float)dt.Columns.Count) * 20.0f);
// Create columns
foreach (DataColumn dc in dt.Columns)
{
tableGrid.Append(new GridColumn() { Width = colWidth.ToString() });
}
table.Append(tableProperties);
table.Append(tableGrid);
// Create rows.
foreach (DataRow dr in dt.Rows)
{
TableRow tableRow = new TableRow()
{
RsidTableRowAddition = "00C5307B",
RsidTableRowProperties = "00C5307B"
};
// Create cells.
foreach (object c in dr.ItemArray)
{
TableCell tableCell = new TableCell();
TableCellProperties tableCellProperties = new TableCellProperties();
TableCellWidth tableCellWidth = new TableCellWidth()
{
Width = colWidth.ToString(),
Type = TableWidthUnitValues.Dxa
};
tableCellProperties.Append(tableCellWidth);
Paragraph paragraph = new Paragraph()
{
RsidParagraphAddition = "00CC797A",
RsidRunAdditionDefault = "00CC797A"
};
Run run = new Run();
Text text = new Text();
text.Text = c.ToString();
run.Append(text);
paragraph.Append(run);
tableCell.Append(tableCellProperties);
tableCell.Append(paragraph);
tableRow.Append(tableCell);
}
table.Append(tableRow);
}
return table;
}
2つのアプローチによって生成された結果のxmlはかなり異なります。OpenXML SDK Productivityツールなどのツールを使用して、生成されたxmlを表示します。生成されたxmlにテーブルの定義が表示されaltChunk
ない場合。