• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

画情画心画影

--寒冬玉
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

用C# 动态生成含有报表图表的word文件

用C# 动态生成含有报表图表的word文件.

刚开始,觉得没什么难的,不就是一个图表吗? 原来也做过基于模板的Excel报表,应该没问题..

从网上先找一个范例研究一下....

给果,大失所望,在网上只找到了一个如下的所谓"范例":

 

view plaincopy to clipboardprint?
  1. object oMissing = System.Reflection.Missing.Value;   
  2.     object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */  
  3.   
  4.     //Start Word and create a new document.   
  5.     Word._Application oWord;   
  6.     Word._Document oDoc;   
  7.     oWord = new Word.Application();   
  8.     oWord.Visible = true;   
  9.     oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,   
  10.         ref oMissing, ref oMissing);   
  11.   
  12.     //Insert a paragraph at the beginning of the document.   
  13.     Word.Paragraph oPara1;   
  14.     oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);   
  15.     oPara1.Range.Text = "Heading 1";   
  16.     oPara1.Range.Font.Bold = 1;   
  17.     oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.   
  18.     oPara1.Range.InsertParagraphAfter();   
  19.   
  20.     //Insert a paragraph at the end of the document.   
  21.     Word.Paragraph oPara2;   
  22.     object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  23.     oPara2 = oDoc.Content.Paragraphs.Add (ref oRng);   
  24.     oPara2.Range.Text = "Heading 2";   
  25.     oPara2.Format.SpaceAfter = 6;   
  26.     oPara2.Range.InsertParagraphAfter();   
  27.   
  28.     //Insert another paragraph.   
  29.     Word.Paragraph oPara3;   
  30.     oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  31.     oPara3 = oDoc.Content.Paragraphs.Add(ref oRng);   
  32.     oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:";   
  33.     oPara3.Range.Font.Bold = 0;   
  34.     oPara3.Format.SpaceAfter = 24;   
  35.     oPara3.Range.InsertParagraphAfter();   
  36.   
  37.     //Insert a 3 x 5 table, fill it with data, and make the first row   
  38.     //bold and italic.   
  39.     Word.Table oTable;   
  40.      Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  41.     oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);   
  42.     oTable.Range.ParagraphFormat.SpaceAfter = 6;   
  43.     int r, c;   
  44.     string strText;   
  45.     for(r = 1; r <= 3; r++)   
  46.         for(c = 1; c <= 5; c++)   
  47.         {   
  48.             strText = "r" + r + "c" + c;   
  49.             oTable.Cell(r, c).Range.Text = strText;   
  50.         }   
  51.     oTable.Rows[1].Range.Font.Bold = 1;   
  52.     oTable.Rows[1].Range.Font.Italic = 1;   
  53.   
  54.     //Add some text after the table.   
  55.     Word.Paragraph oPara4;   
  56.     oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  57.     oPara4 = oDoc.Content.Paragraphs.Add(ref oRng);   
  58.     oPara4.Range.InsertParagraphBefore();   
  59.     oPara4.Range.Text = "And here's another table:";   
  60.     oPara4.Format.SpaceAfter = 24;   
  61.     oPara4.Range.InsertParagraphAfter ();   
  62.   
  63.     //Insert a 5 x 2 table, fill it with data, and change the column widths.   
  64.     wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  65.     oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);   
  66.     oTable.Range.ParagraphFormat.SpaceAfter = 6;   
  67.     for(r = 1; r <= 5; r++)   
  68.         for(c = 1; c <= 2; c++)   
  69.         {   
  70.             strText = "r" + r + "c" + c;   
  71.             oTable.Cell (r, c).Range.Text = strText;   
  72.         }   
  73.     oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2   
  74.     oTable.Columns[2].Width = oWord.InchesToPoints(3);   
  75.   
  76.     //Keep inserting text. When you get to 7 inches from top of the   
  77.     //document, insert a hard page break.   
  78.     object oPos;   
  79.     double dPos = oWord.InchesToPoints(7);   
  80.     oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();   
  81.     do  
  82.     {   
  83.         wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  84.         wrdRng.ParagraphFormat.SpaceAfter = 6;   
  85.         wrdRng.InsertAfter("A line of text");   
  86.         wrdRng.InsertParagraphAfter();   
  87.         oPos = wrdRng.get_Information   
  88.                        (Word.WdInformation.wdVerticalPositionRelativeToPage);   
  89.     }   
  90.     while(dPos >= Convert.ToDouble(oPos));   
  91.     object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;   
  92.     object oPageBreak = Word.WdBreakType.wdPageBreak;   
  93.     wrdRng.Collapse(ref oCollapseEnd);   
  94.     wrdRng.InsertBreak(ref oPageBreak);   
  95.     wrdRng.Collapse(ref oCollapseEnd);   
  96.     wrdRng.InsertAfter("We're now on page 2. Here's my chart:");   
  97.     wrdRng.InsertParagraphAfter();   
  98.   
  99.     //Insert a chart.   
  100.     Word.InlineShape oShape;   
  101.     object oClassType = "MSGraph.Chart.8";   
  102.     wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  103.     oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing,   
  104.         ref oMissing, ref oMissing, ref oMissing,   
  105.         ref oMissing, ref oMissing, ref oMissing);   
  106.   
  107.     //Demonstrate use of late bound oChart and oChartApp objects to   
  108.     //manipulate the chart object with MSGraph.   
  109.     object oChart;   
  110.     object oChartApp;   
  111.     oChart = oShape.OLEFormat.Object;   
  112.     oChartApp = oChart.GetType().InvokeMember("Application",   
  113.          BindingFlags.GetProperty, null, oChart, null);   
  114.   
  115.     //Change the chart type to Line.   
  116.     object[] Parameters = new Object[1];   
  117.     Parameters[0] = 4; //xlLine = 4   
  118.     oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,   
  119.         null, oChart, Parameters);   
  120.   
  121.     //Update the chart image and quit MSGraph.   
  122.     oChartApp.GetType().InvokeMember("Update",   
  123.         BindingFlags.InvokeMethod, null, oChartApp, null);   
  124.     oChartApp.GetType().InvokeMember("Quit",   
  125.         BindingFlags.InvokeMethod, null, oChartApp, null);   
  126.     //... If desired, you can proceed from here using the Microsoft Graph   
  127.     //Object model on the oChart and oChartApp objects to make additional   
  128.     //changes to the chart.   
  129.   
  130.     //Set the width of the chart.   
  131.     oShape.Width = oWord.InchesToPoints(6.25f);   
  132.     oShape.Height = oWord.InchesToPoints(3.57f);   
  133.   
  134.     //Add text after the chart.   
  135.     wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;   
  136.     wrdRng.InsertParagraphAfter();   
  137.     wrdRng.InsertAfter("THE END.");   
  138.   
  139.     //Close this form.   
  140.     this.Close();  
object oMissing = System.Reflection.Missing.Value;

    object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */



    //Start Word and create a new document.

    Word._Application oWord;

    Word._Document oDoc;

    oWord = new Word.Application();

    oWord.Visible = true;

    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,

        ref oMissing, ref oMissing);



    //Insert a paragraph at the beginning of the document.

    Word.Paragraph oPara1;

    oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);

    oPara1.Range.Text = "Heading 1";

    oPara1.Range.Font.Bold = 1;

    oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.

    oPara1.Range.InsertParagraphAfter();



    //Insert a paragraph at the end of the document.

    Word.Paragraph oPara2;

    object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oPara2 = oDoc.Content.Paragraphs.Add (ref oRng);

    oPara2.Range.Text = "Heading 2";

    oPara2.Format.SpaceAfter = 6;

    oPara2.Range.InsertParagraphAfter();



    //Insert another paragraph.

    Word.Paragraph oPara3;

    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oPara3 = oDoc.Content.Paragraphs.Add(ref oRng);

    oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:";

    oPara3.Range.Font.Bold = 0;

    oPara3.Format.SpaceAfter = 24;

    oPara3.Range.InsertParagraphAfter();



    //Insert a 3 x 5 table, fill it with data, and make the first row

    //bold and italic.

    Word.Table oTable;

     Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);

    oTable.Range.ParagraphFormat.SpaceAfter = 6;

    int r, c;

    string strText;

    for(r = 1; r <= 3; r++)

        for(c = 1; c <= 5; c++)

        {

            strText = "r" + r + "c" + c;

            oTable.Cell(r, c).Range.Text = strText;

        }

    oTable.Rows[1].Range.Font.Bold = 1;

    oTable.Rows[1].Range.Font.Italic = 1;



    //Add some text after the table.

    Word.Paragraph oPara4;

    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oPara4 = oDoc.Content.Paragraphs.Add(ref oRng);

    oPara4.Range.InsertParagraphBefore();

    oPara4.Range.Text = "And here's another table:";

    oPara4.Format.SpaceAfter = 24;

    oPara4.Range.InsertParagraphAfter ();



    //Insert a 5 x 2 table, fill it with data, and change the column widths.

    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);

    oTable.Range.ParagraphFormat.SpaceAfter = 6;

    for(r = 1; r <= 5; r++)

        for(c = 1; c <= 2; c++)

        {

            strText = "r" + r + "c" + c;

            oTable.Cell (r, c).Range.Text = strText;

        }

    oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2

    oTable.Columns[2].Width = oWord.InchesToPoints(3);



    //Keep inserting text. When you get to 7 inches from top of the

    //document, insert a hard page break.

    object oPos;

    double dPos = oWord.InchesToPoints(7);

    oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();

    do

    {

        wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

        wrdRng.ParagraphFormat.SpaceAfter = 6;

        wrdRng.InsertAfter("A line of text");

        wrdRng.InsertParagraphAfter();

        oPos = wrdRng.get_Information

                       (Word.WdInformation.wdVerticalPositionRelativeToPage);

    }

    while(dPos >= Convert.ToDouble(oPos));

    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;

    object oPageBreak = Word.WdBreakType.wdPageBreak;

    wrdRng.Collapse(ref oCollapseEnd);

    wrdRng.InsertBreak(ref oPageBreak);

    wrdRng.Collapse(ref oCollapseEnd);

    wrdRng.InsertAfter("We're now on page 2. Here's my chart:");

    wrdRng.InsertParagraphAfter();



    //Insert a chart.

    Word.InlineShape oShape;

    object oClassType = "MSGraph.Chart.8";

    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing,

        ref oMissing, ref oMissing, ref oMissing,

        ref oMissing, ref oMissing, ref oMissing);



    //Demonstrate use of late bound oChart and oChartApp objects to

    //manipulate the chart object with MSGraph.

    object oChart;

    object oChartApp;

    oChart = oShape.OLEFormat.Object;

    oChartApp = oChart.GetType().InvokeMember("Application",

         BindingFlags.GetProperty, null, oChart, null);



    //Change the chart type to Line.

    object[] Parameters = new Object[1];

    Parameters[0] = 4; //xlLine = 4

    oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,

        null, oChart, Parameters);



    //Update the chart image and quit MSGraph.

    oChartApp.GetType().InvokeMember("Update",

        BindingFlags.InvokeMethod, null, oChartApp, null);

    oChartApp.GetType().InvokeMember("Quit",

        BindingFlags.InvokeMethod, null, oChartApp, null);

    //... If desired, you can proceed from here using the Microsoft Graph

    //Object model on the oChart and oChartApp objects to make additional

    //changes to the chart.



    //Set the width of the chart.

    oShape.Width = oWord.InchesToPoints(6.25f);

    oShape.Height = oWord.InchesToPoints(3.57f);



    //Add text after the chart.

    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    wrdRng.InsertParagraphAfter();

    wrdRng.InsertAfter("THE END.");



    //Close this form.

    this.Close();

对着代码研究一下,无法就是新建文字段之类的,而看到我最关注的报表时,大失所望,只有这么可怜的一段..

view plaincopy to clipboardprint?
  1. //Demonstrate use of late bound oChart and oChartApp objects to   
  2.     //manipulate the chart object with MSGraph.   
  3.     object oChart;   
  4.     object oChartApp;   
  5.     oChart = oShape.OLEFormat.Object;   
  6.     oChartApp = oChart.GetType().InvokeMember("Application",   
  7.          BindingFlags.GetProperty, null, oChart, null);   
  8.   
  9.     //Change the chart type to Line.   
  10.     object[] Parameters = new Object[1];   
  11.     Parameters[0] = 4; //xlLine = 4   
  12.     oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,   
  13.         null, oChart, Parameters);   
  14.   
  15.     //Update the chart image and quit MSGraph.   
  16.     oChartApp.GetType().InvokeMember("Update",   
  17.         BindingFlags.InvokeMethod, null, oChartApp, null);   
  18.     oChartApp.GetType().InvokeMember("Quit",   
  19.         BindingFlags.InvokeMethod, null, oChartApp, null);   
  20.     //... If desired, you can proceed from here using the Microsoft Graph   
  21.     //Object model on the oChart and oChartApp objects to make additional   
  22.     //changes to the chart.  
//Demonstrate use of late bound oChart and oChartApp objects to

    //manipulate the chart object with MSGraph.

    object oChart;

    object oChartApp;

    oChart = oShape.OLEFormat.Object;

    oChartApp = oChart.GetType().InvokeMember("Application",

         BindingFlags.GetProperty, null, oChart, null);



    //Change the chart type to Line.

    object[] Parameters = new Object[1];

    Parameters[0] = 4; //xlLine = 4

    oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,

        null, oChart, Parameters);



    //Update the chart image and quit MSGraph.

    oChartApp.GetType().InvokeMember("Update",

        BindingFlags.InvokeMethod, null, oChartApp, null);

    oChartApp.GetType().InvokeMember("Quit",

        BindingFlags.InvokeMethod, null, oChartApp, null);

    //... If desired, you can proceed from here using the Microsoft Graph

    //Object model on the oChart and oChartApp objects to make additional

    //changes to the chart.

MSGraph是什么? 怎么动态设定数据? 上述可怜的代码中都没有提,最郁闷的是,所有调用都以InvokMember实现,

这意味着如果看不到真正的说明,跟本无法知道调用的接口是什么....

上网去找MSGraph.Chart.8

还是一无所获......

头一次遇到这种问题,感觉头都胀了....

静下心来想一下,没办法,想办法找这个动态连接库吧..

先全C盘找MSGraph.Dll  一无所获,后来在调试时,发现在生成图表时,会有一个Graph的进程,去搜它,结果在office安装目录 office11下找到了. 将这个程序加到引用中,用对像浏览器浏览...结果..

呵呵 ,看到了下面的东东

 哈哈,应该就是这个了.试探了几个函数,果然没错.

下一步,就是设计一个Word文档模板,进行测试了.

先新建一个word文件,插入一个图表,之后给这个图表设置好书签,保存为模板Report(如果这些你不明白,建议先去学一下word...)

这回,再在程序里做如下测试:

view plaincopy to clipboardprint?
  1. object oMissing = System.Reflection.Missing.Value;   
  2.            object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */  
  3.            object remarkOverTable = "OverTable";   
  4.   
  5.            //Start Word and create a new document.   
  6.            Microsoft.Office.Interop.Word._Application oWord;   
  7.            Microsoft.Office.Interop.Word._Document oDoc;   
  8.            oWord = new Microsoft.Office.Interop.Word.Application();   
  9.            oWord.Visible = true ;   
  10.            object  Template = "Report.dot";   
  11.            oDoc = oWord.Documents.Add(ref Template, ref oMissing,   
  12.                ref oMissing, ref oMissing);   
  13.   
  14.            //得到书签   
  15.            Microsoft.Office.Interop.Word.Range TestRemark = oDoc.Bookmarks.get_Item(ref remarkOverTable).Range;   
  16.   
  17.   
  18.            TestRemark.InlineShapes[0].OLEFormat.Open();// 打开OLE对像,注意这一步一定要有   
  19.            Microsoft.Office.Interop.Graph.Chart _testChart =    
  20.                (Microsoft.Office.Interop.Graph.Chart)(TestRemark.InlineShapes[0].OLEFormat.Object);   
  21.            Microsoft.Office.Interop.Graph.Application _testApp =   
  22.                _testChart.Application;   
  23.            object[] Values = new object[] { "91%", "92%", "93%", "94%", "95%" };   
  24.            for (int i = 0, j = System.Convert.ToInt32('A'); i < Values.Length; i++)   
  25.            {   
  26.                //这里的行列式为循环下来填写的是A2,B2,C2,D2.... OK?   
  27.                _testChart.Application.DataSheet.Cells.set_Item(2, System.Convert.ToString(   
  28.                    (char)( j+ i)),   
  29.                    Values[0]);   
  30.            }   
  31.            _testApp.Quit();   
  32.             
 object oMissing = System.Reflection.Missing.Value;

            object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */

            object remarkOverTable = "OverTable";



            //Start Word and create a new document.

            Microsoft.Office.Interop.Word._Application oWord;

            Microsoft.Office.Interop.Word._Document oDoc;

            oWord = new Microsoft.Office.Interop.Word.Application();

            oWord.Visible = true ;

            object  Template = "Report.dot";

            oDoc = oWord.Documents.Add(ref Template, ref oMissing,

                ref oMissing, ref oMissing);



            //得到书签

            Microsoft.Office.Interop.Word.Range TestRemark = oDoc.Bookmarks.get_Item(ref remarkOverTable).Range;





            TestRemark.InlineShapes[0].OLEFormat.Open();// 打开OLE对像,注意这一步一定要有

            Microsoft.Office.Interop.Graph.Chart _testChart = 

                (Microsoft.Office.Interop.Graph.Chart)(TestRemark.InlineShapes[0].OLEFormat.Object);

            Microsoft.Office.Interop.Graph.Application _testApp =

                _testChart.Application;

            object[] Values = new object[] { "91%", "92%", "93%", "94%", "95%" };

            for (int i = 0, j = System.Convert.ToInt32('A'); i < Values.Length; i++)

            {

                //这里的行列式为循环下来填写的是A2,B2,C2,D2.... OK?

                _testChart.Application.DataSheet.Cells.set_Item(2, System.Convert.ToString(

                    (char)( j+ i)),

                    Values[0]);

            }

            _testApp.Quit();

           

大功告成,哈哈

写的有点乱,但是有如下建议:

1.对像浏览器是一个很好用的东西,在一些情况下,用其去看未知DLL的接口,不失为一种好选择.

2.在调试过程中,"监视"窗体其实是一个很用的对外接口,对于刚得到接口的DLL,在不知道具体函数,类型的功能时,可以在程序声明,实例化对像后设置断点,在监视窗体中试验性的执行各种函数,以了解其功能.

posted on 2008-07-08 15:49  Winter001  阅读(1321)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3