C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)
一、思路: 1、excel是可以通过NPOI插入图片的;
2、C#通过NPOI生成饼状图;
3、把生成的饼状图以字节流的形式插入到表格
二、看代码:
#region 生成饼图图例
/// <summary>
/// 生成饼图饼图的颜色随机产生
/// </summary>
/// <param name="width">图片宽度</param>
/// <param name="height">图片高度</param>
/// <param name="radius">饼图半径</param>
/// <param name="data">数据源</param>
/// <param name="legends">图例</param>
/// <returns></returns>
public static Bitmap GetPieGraphic(int width, int height, int radius, float[] data, string[] legends)
{
if (data != null)
{
string familyName = "Arial";
Bitmap objbitmap = new Bitmap(width, height);
Graphics objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Color.White);
//抗锯齿
objgraphics.SmoothingMode = SmoothingMode.HighQuality;
//高质量的文字
objgraphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
//像素均偏移0.5个单位,以消除锯齿
objgraphics.PixelOffsetMode = PixelOffsetMode.Half;
//定位饼图绘制的位置
Rectangle rect = new Rectangle(width / , height / , radius, radius);
Random random = new Random();
float currentdegree = 0.0f;
float Total = data.Sum();
List<Color> listColor =new List<Color>();
for (int i = ; i < data.Length; i++)
{
Color temC = Color.FromArgb(random.Next(), random.Next(), random.Next());
listColor.Add(temC);
SolidBrush brush = new SolidBrush(temC);
objgraphics.FillPie(brush, rect, currentdegree, Convert.ToSingle(data[i] / Total * ));
currentdegree += Convert.ToSingle(data[i] / Total * );
}
//放置图例
PointF basePoint = new PointF(, );
//色块的大小
SizeF theSize = new SizeF(, );
//第一个色块的说明文字的位置 PointF textPoint = new PointF(basePoint.X + , basePoint.Y);
for (int j = ; j < listColor.Count; j++)
{
RectangleF baseRectangle = new RectangleF(basePoint, theSize);
//画代表色块 objgraphics.FillRectangle(new SolidBrush(listColor[j]), baseRectangle);
string temstr = String.Format("{0}%", (data[j] / Total * ).ToString("#0.00"));
objgraphics.DrawString(legends[j] + " " + temstr, new Font(familyName, ), Brushes.Black, textPoint);
basePoint.Y += ;
textPoint.Y += ;
}
return objbitmap;
}
else
{
return null;
}
}
/// <summary>
/// 将BitMap类型的图像数据转换成byte[]
/// </summary>
/// <param name="bitmap">图像数据</param>
/// <returns></returns>
public static byte[] Bitmap2Byte(Bitmap bitmap)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] data = new byte[stream.Length];
stream.Seek(, SeekOrigin.Begin);
stream.Read(data, , Convert.ToInt32(stream.Length));
return data;
}
}
#endregion 生成饼图图例
三、在处理表格数据出插入下面代码:
//legends和data可以是动态数据
String[] legends = {"A满意","B基本满意","C不满意" };
float[] data = {,, };
Bitmap bitmap = GetPieGraphic(,,,data,legends);
var row101 = sheet.CreateRow();
row101.Height = * ;
//将图片文件读入一个字符串
byte[] bytes = Bitmap2Byte(bitmap);
int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
// 插图片的位置 HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2) 后面再作解释
HSSFClientAnchor anchor = new HSSFClientAnchor(, , , , , , , );
//把图片插到相应的位置
HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
C#应用NPOI实现导出EXcel表格中插入饼状图(可实现动态数据生成)的更多相关文章
- C#调用NPOI组件导出Excel表格
把一个List集合的数据导出到Excel表格中 public static string RenderToExcel<T>(List<T> datas) { MemoryStr ...
- js导出excel表格中较长数字串会变成科学计数法问题
在做项目中,遇到导出excel表格时,银行账户号数字过长,导出的数字串变为计数法形式,如下图: 网上搜到解决方法,粘贴到这以供学习.不断更新. 原博地址:http://www.cnblogs.com/ ...
- C# 如何在Excel表格中插入、编辑和删除批注
概述 为文档添加必要的批注可以给文档使用者提供重要的提示信息,下面的示例中,将介绍通过C#编程语言来给Excel表格中的指定单元格内容添加批注,此外,对于已有的批注,如果需要修改,我们也可以进行编辑或 ...
- NX二次开发-OLE/COM向EXCEL表格中插入图片
今晚有一个兄弟问我怎么往EXCEL里插入图片(加工程序单中需要插入图片),这个我之前也没弄过,回复了他一句不知道,后来刚刚干完游戏吃完鸡,就去VC++的书上翻了翻,还真的被我翻到了.VC++的方法往E ...
- excel表格中,怎么根据一列重复的数据求对应另一列总和
如下: 求出姓名对应分数总和对应 : 首先复制一份Sheet2 对Sheet1进行操作选中A列姓名 数据->删除重复项->以前选中区域排序->删除重复项 然后删除对应成绩项选中张三对 ...
- C#的WinForm中制作饼状图和柱状图
using System; using System.IO;//用于文件存取 using System.Data;//用于数据访问 using System.Drawing;//提供画GDI+图形的基 ...
- 转:C# 中 MSCHART 饼状图显示百分比
转自:http://blog.sina.com.cn/s/blog_51beaf0e0100yffo.html 1)显示百分比 Chart1.Series["Series1"].L ...
- JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]
我用JFreeChart框架生成饼状图,但想把数据信息在饼图上显示,是在饼图内部(即圆内)显示!怎样实现啊?? 去掉lablepieplot.setLabelGenerator(null);去掉线p ...
- 关于echarts中的饼状图的label文字显示过长的问题
label: { normal: { fontSize: 14, formatter(v) { let text = v.name let count = text.indexOf('¥') cons ...
随机推荐
- P1219 八皇后
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 百度地图点聚合MarkerClusterer性能优化
公司要求做个百度地图点聚合的性能优化,需一次性加载9万条数据. 记录下自己的优化过程.(只想看优化代码的可直接移步:步骤三) 一.引入百度地图 vue项目中,在index.html文件中用script ...
- GhostScript应用一例:使用GhostScript强行修改加密PDF
GhostScript官方网站为:http://www.ghostscript.com/ 作为一个英文开源软件,发现国内用的人很少.尤其是在Windows环境下,Acrobat/Adobe/Foxit ...
- IDEA中显示RunDashboard
在打开.idea/workspace.xml,找到RunDashboard的配置,添加红色字体内容 <component name="RunDashboard"> &l ...
- vue项目锚点的使用
在vue项目中如何使用锚点呢? 在vue-router中定义 scrollBehavior scrollBehavior (to, from, savedPosition) { if (savedPo ...
- Excel基本操作
一.excel公式下拉 1.选择最长一列excel ,按CTRL+↓移到最后一个单元格,2光标移到下拉公式的那一列,3.再按CTRL+SHIFT+↑,4.再按CTRL+D 二.输入身份证号等长数字 方 ...
- 浏览器登录EBS系统遇到问题总结
1.可以登录EBS系统,但是职责位置为空白 这是兼容性视图问题,将ERP域名加入兼容性视图列表即可. 加入即可: 2.可以登录EBS系统,但是职责位置显示 “undefined” 这也是兼容性视图问题 ...
- 【系统监控】性能监测 vmstat,mpstat,iostat
一.系统整体性能监测工具:uptime [root@WebServer ~]# uptime (同w命令输出的第一行信息) 09:40:52 up 5 days, 57 min, 1 user, lo ...
- tamptermonkey 脚本初步尝试
刚开始接触tamptermonkey 主要用于基于浏览器的数据采集 基本都是js基础 这里是采集表格里的内容, 构造json, 然后post发送到后台 如果加入定时刷新功能就可以随时或是按照固定或是随 ...
- Linux samba服务搭建
实验准备: 准备两台机器,server0(172.25.0.11)和deskop0(172.25.0.12),要求在server0上实现samba共享,在desktop0上访问共享. 1.允许mark ...