qq_31440703 2022-07-26 17:03 采纳率: 100%
浏览 158
已结题

C#在Word中利用书签方式生成折线图

用c# 可以利用书签的方式在word文档中生成折线图,使用的是using Microsoft.Office.Interop.Word;
using Microsoft.Office.Interop.Graph;两个库文件,数据能传到word里,但是生成折线过程出错,本人基础薄弱,请帮忙看看什么原因

    //生成书签
    private void button3_Click(object sender, EventArgs e)
    {
        var dt = ConvertDgvDataToTable(dataGridView1);
        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Document doc = app.Documents.Add("D:\\Test.docx");
        app = doc.Application;
        doc.ActiveWindow.Visible = true;
        InsertGraphtoBookmark("图表", dt, ref doc, ref app);
    }

    public Microsoft.Office.Interop.Graph.XlChartType ChartType = Microsoft.Office.Interop.Graph.XlChartType.xlLine;
    public void InsertGraphtoBookmark(string strbookmark, System.Data.DataTable dt, ref Microsoft.Office.Interop.Word.Document wDoc, ref Microsoft.Office.Interop.Word.Application WApp)
    {
        int i, j;
        object missing = System.Reflection.Missing.Value;
        object oClassType = "MSGraph.Chart.8";
        //获取书签对象,换句话,把光标移过来
        object bookmark = strbookmark;
        WApp.ActiveDocument.Bookmarks.get_Item(ref bookmark).Select();

        //WApp.Selection.InlineShapes[0].OLEFormat.Open();
        //初始化一张图表
        Microsoft.Office.Interop.Graph.Chart wdChart =
            (Microsoft.Office.Interop.Graph.Chart)WApp.Selection.InlineShapes.AddOLEObject(ref oClassType, ref missing,
            ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing).OLEFormat.Object;
        //wrdChart.Application.Visible = false;

        //改变图表格式
        wdChart.ChartType = ChartType;
        wdChart.Application.PlotBy = Microsoft.Office.Interop.Graph.XlRowCol.xlColumns;//根据Y轴来画图表
        Microsoft.Office.Interop.Graph.Axis axis = (Microsoft.Office.Interop.Graph.Axis)wdChart.Axes(1, 1);//设置X轴的属性
        wdChart.Application.DataSheet.Cells.Clear();//清空表格的初始数据

        //填充图表数据,起始的行号和列号都是1
        for (i = 0; i < dt.Columns.Count; i++)//初始化列名
        {
            wdChart.Application.DataSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
        }

        for (i = 0; i < dt.Rows.Count; i++)//填充数据
        {
            for (j = 0; j < dt.Columns.Count; j++)
            {
                wdChart.Application.DataSheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString();
            }
        }


        //axis.MaximumScale = 1;//X轴最大刻度
        //axis.MajorUnit = 0.1;

        wdChart.Legend.Delete();
        wdChart.Width = 500;

        //wrdChart.Height = 666;
        //oShape.Height = oWord.InchesToPoints(3.57f);

        //更新图表并保存退出
        wdChart.Application.Update();
        wdChart.Application.Quit();
    }

    public static System.Data.DataTable ConvertDgvDataToTable(DataGridView dgv)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        for (int count = 0; count < dgv.Columns.Count; count++)//循环DataGridView中的栏位
        {
            DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
            dt.Columns.Add(dc);// 将DataGridView中栏位的标题写入到DataTable中
        }
        for (int count = 0; count < dgv.Rows.Count - 1; count++)//循环DataGridView中的资料行
        {
            DataRow dr = dt.NewRow();
            for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
            {
                dr[countsub] = dgv.Rows[count].Cells[countsub].Value.ToString();
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }
    //生成曲线
    private void button4_Click(object sender, EventArgs e)
    {
        var dt = ConvertDgvDataToTable(dataGridView1);
        chart1.DataSource = dt;
        chart1.Series[0].XValueMember = "CountryCode";//每周的字段显示在X轴
        chart1.Series[0].YValueMembers = "CityCode";//每周对应的sum和显示在y轴
        chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.Interval = 1;
        chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Interval = 1;
        this.chart1.ChartAreas["ChartArea1"].AxisX.Title = "电压";//X轴标题
        this.chart1.ChartAreas["ChartArea1"].AxisY.Title = "转速";//X轴标题
        this.chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.Enabled = false;//不显示竖着的分割线
        this.chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.Enabled = false;//不显示竖着的分割线
        this.chart1.Series[0].IsValueShownAsLabel = true;//显示坐标值
        this.chart1.DataBind();
    }


    private void button5_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
        Word.Document doc = app.Documents.Add("D:\\Test.docx");
        app = doc.Application;
        doc.ActiveWindow.Visible = true;
        foreach (Word.Bookmark bk in doc.Bookmarks)
        {
            if (bk.Name == "图表")
            {
                object oClassType = "MSGraph.Chart.8";
                Graph.Axis axis;//x坐标
                Word.Range range = bk.Range;
                Graph.Chart wdchart = (Graph.Chart)range.InlineShapes.AddOLEObject(oClassType).OLEFormat.Object;
                wdchart.Application.DataSheet.Cells.Clear();//清空数据集数据
                                                            //axis.MaximumScale = 1;//设置最大刻度

                //填充数据集 
                int i, j;
                for (i = 0; i < 2; i++)
                {
                    wdchart.Application.DataSheet.Cells[i + 1, 1] = "列" + i.ToString();
                }
                for (i = 0; i < 2; i++)//填充数据 
                {
                    for (j = 0; j < 2; j++)
                    {
                        wdchart.Application.DataSheet.Cells[i + 2, j + 1] = i * j;
                    }
                }

                //根据y轴画图 
                wdchart.Application.PlotBy = Graph.XlRowCol.xlColumns;

                wdchart.Legend.Delete();
                wdchart.Height = 280;
                wdchart.Width = 600;

                //更新图标并退出 
                wdchart.Application.Update();
                wdchart.Application.Quit();
                wdchart = null;
            }
        }

        //doc.SaveAs("E:\\Test.docx");
        //app.Quit();
    }
  • 写回答

3条回答 默认 最新

  • EdsionWang 2022-07-26 20:21
    关注

    拿你的代码试了下,没什么大问题。 下面Legend.Delete需要注释掉。你的主要问题是Test.docx文件中并没有创建书签,命名为“图表”的书签。
    打开你的Test.docx文件,选择菜单上的插入,书签,添加一个叫“图表”的书签后保存文件。然后运行代码即可

        //wdChart.Legend.Delete();
        wdChart.Width = 500;
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月6日
  • 已采纳回答 7月29日
  • 创建了问题 7月26日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改