使用 Aspose.Words 插件在 Word 画 EChart 图

  使用此插件可以画出丰富的 EChart 图,API 参考 https://reference.aspose.com/words/net/aspose.words.drawing.charts/charttype/

  首先需要在 vs 中引入插件

  

  代码中添加引用

using Aspose.Words;
using Aspose.Words.Drawing.Charts;
using Aspose.Words.Tables;

  1、插入文字内容和表格

    我们只需要获取模板,并且创建一个文档对象,将内容写入进去即可

    创建表格时,需要创建头,规定每个单元格长度,宽度,将对应的数据库字段对应上

 1 DataTable dt = new DataTable();
2
3 //读取 Word 模板
4 Document doc = new Document("C:\\TestProject\\WebApplication1\\WebApplication1\\Word\\AsposeWord.doc");
5
6 //创建文档对象
7 DocumentBuilder builder = new DocumentBuilder(doc);
8
9 #region 插入文字信息
10 //Word 中对应书签的名称
11 builder.MoveToBookmark("文章标题");
12
13 //写入内容
14 builder.Write("学会使用AsposeWord画EChart图");
15 #endregion
16
17 #region 列表
18 builder.MoveToBookmark("学生信息列表");
19
20 Aspose.Words.Tables.Table table3 = builder.StartTable();//开始画Table
21 string[] columnheadersWD = { "序号", "姓名", "学科", "分数", "性别", "年龄" };
22 string[] columnnamesWD = { "ID", "TNAME", "DNAME", "SAL", "TSEX", "AGE" };
23 double[] colwidthsWD = { 50, 100, 100, 50, 50, 50 };
24
25 dt = DBHelper.ExecuteDataTable("SELECT top 5 * FROM [testdb].[dbo].[TEACHER]");
26
27 InsertTable(builder, table3, columnheadersWD, columnnamesWD, colwidthsWD, dt);
28
29 //第三列的 第三行,第四行 合并
30 MergeCells(table3.Rows[3].Cells[2], table3.Rows[4].Cells[2]);
31 #endregion

  这里我们将画表格的方法和合并单元格的方法封装好了

  1         /// <summary>
2 /// 列表表格
3 /// </summary>
4 /// <param name="builder"></param>
5 /// <param name="table"></param>
6 /// <param name="columnheaders"></param>
7 /// <param name="columnnames"></param>
8 /// <param name="colwidths"></param>
9 /// <param name="statisTable"></param>
10 public static void InsertTable(DocumentBuilder builder, Aspose.Words.Tables.Table table, string[] columnheaders, string[] columnnames, double[] colwidths, DataTable statisTable)
11 {
12 var str = "";
13
14 #region 画表头
15 for (int i = 0; i < columnheaders.Length; i++)
16 {
17 str = columnheaders[i];
18 builder.InsertCell();
19 //Table单元格边框线样式
20 builder.CellFormat.Borders.LineStyle = LineStyle.Single;
21 //Table此单元格宽度
22 builder.RowFormat.Height = 30;
23 builder.CellFormat.Width = colwidths[i];
24 //此单元格中内容垂直对齐方式
25 builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
26 builder.CellFormat.HorizontalMerge = Aspose.Words.Tables.CellMerge.None;
27 builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
28 //字体大小
29 builder.Font.Size = 10;
30 //是否加粗
31 builder.Bold = false;
32 //向此单元格中添加内容
33 builder.Write(str);
34 }
35 builder.EndRow();
36 #endregion
37
38 #region 画数据
39 for (int j = 0; j < statisTable.Rows.Count; j++)
40 {
41 for (int i = 0; i < columnheaders.Length; i++)
42 {
43 try
44 {
45 str = statisTable.Rows[j][columnnames[i]].ToString();
46 }
47 catch (Exception e) { str = ""; }
48 builder.InsertCell();
49 //Table单元格边框线样式
50 builder.CellFormat.Borders.LineStyle = LineStyle.Single;
51 //Table此单元格宽度
52 builder.RowFormat.Height = 30;
53 builder.CellFormat.Width = colwidths[i];
54
55 //builder.CellFormat.Shading.ForegroundPatternColor = Color.Red;//设置单元格颜色
56
57 //此单元格中内容垂直对齐方式
58 builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
59 builder.CellFormat.HorizontalMerge = Aspose.Words.Tables.CellMerge.None;
60 builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
61 //字体大小
62 builder.Font.Size = 10;
63 //是否加粗
64 builder.Bold = false;
65 //向此单元格中添加内容
66 builder.Write(str);
67 }
68 builder.EndRow();
69 }
70 #endregion
71
72 //Table行结束
73 builder.EndTable();
74 table.AutoFit(Aspose.Words.Tables.AutoFitBehavior.FixedColumnWidths);
75 table.Alignment = Aspose.Words.Tables.TableAlignment.Center;
76 }
77
78 /// <summary>
79 /// 合并单元格
80 /// </summary>
81 /// <param name="startCell"></param>
82 /// <param name="endCell"></param>
83 public static void MergeCells(Cell startCell, Cell endCell)
84 {
85 Aspose.Words.Tables.Table parentTable = startCell.ParentRow.ParentTable;
86
87 // Find the row and cell indices for the start and end cell.
88 Point startCellPos = new Point(startCell.ParentRow.IndexOf(startCell), parentTable.IndexOf(startCell.ParentRow));
89 Point endCellPos = new Point(endCell.ParentRow.IndexOf(endCell), parentTable.IndexOf(endCell.ParentRow));
90 // Create the range of cells to be merged based off these indices. Inverse each index if the end cell if before the start cell.
91 Rectangle mergeRange = new Rectangle(Math.Min(startCellPos.X, endCellPos.X), Math.Min(startCellPos.Y, endCellPos.Y), Math.Abs(endCellPos.X - startCellPos.X) + 1,
92 Math.Abs(endCellPos.Y - startCellPos.Y) + 1);
93
94 foreach (Row row in parentTable.Rows)
95 {
96 foreach (Cell cell in row.Cells)
97 {
98 Point currentPos = new Point(row.IndexOf(cell), parentTable.IndexOf(row));
99
100 // Check if the current cell is inside our merge range then merge it.
101 if (mergeRange.Contains(currentPos))
102 {
103 if (currentPos.X == mergeRange.X)
104 cell.CellFormat.HorizontalMerge = CellMerge.First;
105 else
106 cell.CellFormat.HorizontalMerge = (CellMerge.Previous);
107
108 if (currentPos.Y == mergeRange.Y)
109 cell.CellFormat.VerticalMerge = (CellMerge.First);
110 else
111 cell.CellFormat.VerticalMerge = (CellMerge.Previous);
112 }
113 }
114 }
115 }

  2、单双曲线图,饼图,柱状图

    曲线图需要用到 InsertChart 方法指定图表类型 Line,这三种图区别不大方法一样,只需要指定图表类型

    ChartSeriesCollection seriesCollection = chart.Series; 提供了向图表插入数据的操作,有点类似 List 如果你只有一条曲线(柱状图),写一个 Add 就行,如果是多条曲线(柱状图),则添加多个 Add 数据即可展示多条曲线(柱状图)

 1 #region 曲线
2 builder.MoveToBookmark("双曲线");
3 var shape = builder.InsertChart(ChartType.Line, 430, 210);//插入线形图
4 Chart chart = shape.Chart;
5 ChartSeriesCollection seriesCollection = chart.Series;
6 seriesCollection.Clear();//清除默认
7 chart.Title.Text = "双曲线";
8 chart.AxisX.TickLabelPosition = AxisTickLabelPosition.Low;
9
10 dt = DBHelper.ExecuteDataTable("select top 5 TNAME,sal,sal+100 as SAL1 from TEACHER");
11
12 var categories = new string[dt.Rows.Count];
13 var values = new double[dt.Rows.Count];
14 var values1 = new double[dt.Rows.Count];
15
16 for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
17 {
18 categories[rowIndex] = dt.Rows[rowIndex][0].ToString();
19 values[rowIndex] = Convert.ToDouble(dt.Rows[rowIndex][1]);
20 values1[rowIndex] = Convert.ToDouble(dt.Rows[rowIndex][2]);
21 }
22
23 chart.Legend.Position = LegendPosition.Top;
24
25 seriesCollection.Add("线条一", categories, values);//添加数据
26 seriesCollection.Add("线条二", categories, values1);//添加数据
27 #endregion
28
29 #region 饼状图
30 dt = DBHelper.ExecuteDataTable("select top 1 sal,sal+100 as SAL1,sal+200 as SAL2 from TEACHER");
31
32 List<CountModel> list1 = new List<CountModel>();
33 for (int i = 0; i < dt.Rows.Count; i++)
34 {
35 list1.Add(new CountModel { mark = "一", num = Convert.ToDouble(dt.Rows[i][0]) });
36 list1.Add(new CountModel { mark = "二", num = Convert.ToDouble(dt.Rows[i][1]) });
37 list1.Add(new CountModel { mark = "三", num = Convert.ToDouble(dt.Rows[i][2]) });
38 }
39
40 builder.MoveToBookmark("饼状图");
41 var shape1 = builder.InsertChart(ChartType.Pie, 430, 210);//插入线形图
42 Chart chart1 = shape1.Chart;
43 ChartSeriesCollection seriesCollection1 = chart1.Series;
44 seriesCollection1.Clear();//清除默认
45 chart1.Title.Text = "饼状图";
46
47 var categories2 = new string[list1.Count];
48 var values2 = new double[list1.Count];
49
50 for (int rowIndex = 0; rowIndex < list1.Count; rowIndex++)
51 {
52 categories2[rowIndex] = list1[rowIndex].mark.ToString();
53 values2[rowIndex] = Convert.ToDouble(list1[rowIndex].num);
54 }
55
56 chart1.Legend.Position = LegendPosition.Top;
57
58 seriesCollection1.Add("饼状图", categories2, values2);//添加数据
59 #endregion
60
61 #region 柱状图
62 dt = DBHelper.ExecuteDataTable("select top 5 tname,sal,sal+100 as SAL1,sal+200 as SAL2 from TEACHER");
63
64 builder.MoveToBookmark("柱状图");
65 var shape2 = builder.InsertChart(ChartType.Column, 430, 210);//插入线形图
66 Chart chart2 = shape2.Chart;
67 ChartSeriesCollection seriesCollection3 = chart2.Series;
68 seriesCollection3.Clear();//清除默认
69 chart2.Title.Text = "柱状图";
70 chart2.AxisX.TickLabelPosition = AxisTickLabelPosition.Low;
71
72 var categories3 = new string[dt.Rows.Count];
73 var values11 = new double[dt.Rows.Count];
74 var values22 = new double[dt.Rows.Count];
75 var values3 = new double[dt.Rows.Count];
76
77 for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
78 {
79 categories3[rowIndex] = dt.Rows[rowIndex][0].ToString();
80 values11[rowIndex] = Convert.ToDouble(dt.Rows[rowIndex][1]);
81 values22[rowIndex] = Convert.ToDouble(dt.Rows[rowIndex][2]);
82 values3[rowIndex] = Convert.ToDouble(dt.Rows[rowIndex][3]);
83 }
84
85 chart2.Legend.Position = LegendPosition.Top;
86
87 seriesCollection3.Add("一", categories3, values11);//添加数据
88 seriesCollection3.Add("二", categories3, values22);//添加数据
89 seriesCollection3.Add("三", categories3, values3);//添加数据
90 #endregion

  3、散点图

    散点图跟其他图略有区别,散点图是 XY 的坐标点形式处理数据

 1 #region 散点图
2 var result = new List<SD>();
3 result.Add(new SD() { wd = 15, wy = 16 });
4 result.Add(new SD() { wd = 14, wy = 23 });
5 result.Add(new SD() { wd = 34, wy = 23 });
6 result.Add(new SD() { wd = 12, wy = 23 });
7 result.Add(new SD() { wd = 34, wy = 45 });
8 result.Add(new SD() { wd = 32, wy = 23 });
9 result.Add(new SD() { wd = 45, wy = 56 });
10 result.Add(new SD() { wd = 34, wy = 55 });
11
12 builder.MoveToBookmark("散点图");
13 var shape3 = builder.InsertChart(ChartType.Scatter, 430, 210);//插入线形图
14 Chart chart3 = shape3.Chart;
15 ChartSeriesCollection seriesCollection4 = chart3.Series;
16 seriesCollection4.Clear();//清除默认
17 chart3.Title.Text = "散点图";
18 chart3.AxisX.TickLabelPosition = AxisTickLabelPosition.Low;
19
20 var categories4 = new double[result.Count];
21 var values4 = new double[result.Count];
22
23 for (int i = 0; i < result.Count; i++)
24 {
25 categories4[i] = Convert.ToDouble(result[i].wd);
26 values4[i] = Convert.ToDouble(result[i].wy);
27 }
28
29 chart3.Legend.Position = LegendPosition.Top;
30 seriesCollection4.Add("散点图", categories4, values4);//添加数据
31 #endregion

  最后将内容输出到指定的新文档中

1 string cpath = "C:\\TestProject\\测试文档存放\\文档" + DateTime.Now.ToString("ddhhmmss") + ".doc";
2 doc.Save(cpath);
3 doc.Save(cpath.Replace(".doc", ".pdf"), SaveFormat.Pdf); //同时转成 PDF 生成一份

  这里只是简单的操作显示图表,如果需要具体详细的细节操作,参考官方提供的API文档。

  效果图

Aspose.Words 操作 Word 画 EChart 图的更多相关文章

  1. Aspose.Words操作word生成PDF文档

    Aspose.Words操作word生成PDF文档 using Aspose.Words; using System; using System.Collections.Generic; using ...

  2. C#使用Aspose.Words操作word文档

    最近接到个需求,由于客服这边要导出大量有一定规则的word文件,里面的内容希望系统自动填充,例如 这里我使用Aspose.Words.dll这个类库, 1.首先,我们需要创建模板文件,毕竟有规则的东西 ...

  3. Aspose.Words操作Word.PDF,让图片和文本垂直居中,水平居中解决方案

    x 环境 { "Aspose.Words": {"Version":"18.x"} } 需求与难题 生成试卷的时候,如果数学题目中有特殊符号 ...

  4. 画echart图时,安卓手机正常,苹果手机上tooltip 在坐标轴下一层

    问题: 解决: 在tooltip 中添加如下代码: tooltip:{ position:function(point, params , dom, rect, size){ dom.style.tr ...

  5. C#操作Word Aspose.Words组件介绍及使用—基本介绍与DOM概述

    1.基本介绍 Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务.Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XP ...

  6. 相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了!

    相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了! 先说图片X×dpi=点数dotX是图片实际尺寸,简单点,我们只算图片的高吧,比如说拍了张图片14 ...

  7. Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件

    Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...

  8. C#Aspose操作Word & Excel简版(后会研究补充更多功能)

    利用Aspose操作Word & Excel首先要在项目中标引用Aspose.Words.dll和Aspose.Cells.dll. 首先说一说向Word中写入数据,目前做的是向Word中的标 ...

  9. CAD画三维图怎么渲染?一分钟教你快速操作

    从事过CAD相关工作的都知道,CAD绘制的方式有二维平面图以及三维图形,三维图形,画三维图方式也是比较简单的.那当然三维图画完后一般还需要进行渲染操作,步骤也是比较简洁的.下面就来给大家操作一下CAD ...

随机推荐

  1. 使用 CSS 构建强大且酷炫的粒子动画

    粒子动画,顾名思义,就是页面上存在大量的粒子构建而成的动画.传统的粒子动画主要由 Canvas.WebGL 实现. 当然,不使用 HTML + CSS 的主要原因在于,粒子动画通常需要较多的粒子,而如 ...

  2. C++ 练气期之函数探幽

    1. 函数基础 一个C++程序中,往往需要包含若干个函数,可以说函数是C++程序的基础组成元件,是程序中的头等公民. 如果要理解程序中使用函数的具体意义,则需要了解语言发展过程中致力要解决的 2 问题 ...

  3. 感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k

    本周伊始,Apache DolphinScheduler 项目在 GitHub 上的 Github Star 总数首次突破 8K.目前,Apache DolphinScheduler 社区已经拥有 C ...

  4. JDK数组阻塞队列源码深入剖析

    JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...

  5. React报错之Expected an assignment or function call and instead saw an expression

    正文从这开始~ 总览 当我们忘记从函数中返回值时,会产生"Expected an assignment or function call and instead saw an express ...

  6. 从0搭建Vue3组件库:button组件

    button组件几乎是每个组件库都有的:其实实现一个button组件是很简单的.本篇文章将带你一步一步的实现一个button组件.如果你想了解完整的组件库搭建,你可以先看使用Vite和TypeScri ...

  7. 经典01背包问题(C++)--详解

    二维数组解决01背包问题 题目: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容 ...

  8. 【NOI P模拟赛】仙人掌(圆方树,树形DP)

    题面 n n n 个点, m m m 条边. 1 ≤ n ≤ 1 0 5 , n − 1 ≤ m ≤ 2 × 1 0 5 1\leq n\leq 10^5,n-1\leq m\leq 2\times1 ...

  9. P4675 [BalticOI 2016 day1]Park (并查集)

    题面 在 Byteland 的首都,有一个以围墙包裹的矩形公园,其中以圆形表示游客和树. 公园里有四个入口,分别在四个角落( 1 , 2 , 3 , 4 1, 2, 3, 4 1,2,3,4 分别对应 ...

  10. 学军中学第三届“图灵杯”趣味网络邀请赛——中级T4.欧拉回路 (图论,哈希)

    题面 补题链接 7 5 6 7 1 2 3 3 13 5 30 50 10 30 70 8 题解 存在欧拉回路的条件是:1. 每个点的度数都是偶数.2. 有边的连通块最多一个. 数据范围是允许我们 n ...