1

GridViewがあり、開いているXMLテーブルを使用してWord文書にエクスポートしたい

var dt = FunctionThatReturnDataTable(id);            
var gd = new GridView
             {
                DataSource = dt,
                AutoGenerateColumns = true
             };

単語ドキュメントを作成し、その中に1つの段落を挿入しました。次に、グリッドビューを下に追加します。

using (var myDoc = WordprocessingDocument.Create(@"c:test.doc",
                                    WordprocessingDocumentType.Document))
{                    
  MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
  mainPart.Document = new Document();
  var body = new Body();
  var p = new Paragraph(new ParagraphProperties(
             new Justification() { Val = JustificationValues.Center }), 
                           new Run(new Text("Some Text")));
  body.Append(p);
  mainPart.Document.Append(body);
  mainPart.Document.Save();
}
4

1 に答える 1

2

GridViewASP.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ない場合。

于 2012-06-18T19:36:52.293 に答える