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 ...
随机推荐
- linux程序一般设置
看canal的时候看了下deploy的脚本,发现很多系统都大同小异 如果是需要debug,就需要开启调试端口 if [ "$1" = "debug" ]; th ...
- Kivy / Buildozer VM Ubuntu不能连接到网络的问题解决
从kivy网站下载下来的Buildozer VM镜像在进入虚拟机以后无论虚拟机里边的虚拟网络编辑器以及网络适配器网络连接作何设置都不能连接到网络,在终端里边使用ifconfig查看ip地址是127.0 ...
- Html 内容
1.Html就是超文本标记语言的简写,是最基础的网页语言. 2.Html是通过标签来定义的语言,代码都是由标签组成的. 3.Html代码不用区分大小写. 4.Html代码由<html>开始 ...
- bind和on的区别
bind方法与on方法都是事件绑定,但是两者却又有着一个大区别:事件委托 jquery文档中bind和on函数绑定事件的用法: .bind(events [,eventData], handler) ...
- pwnable.kr-passcode-witeup
进入远端运行, 废话不多说,下载下来分析. 根据提示,编译一下子. 知道问题了. 想象着,输入的值到了passcode1和passcode2的值作为地址的地方,passcode1处刚输入值时,程序终止 ...
- [剑指Offer]60-n个骰子的点数
题意 输入骰子个数n,打印出所有骰子朝上的点的点数之和,及对应的概率. 题解 循环. n个骰子,点数之和在n~6n范围内.计算n个骰子扔出和为m的情况数,等于n-1个骰子扔出m-1,m-2...m-6 ...
- vue的事件处理梳理
一.事件函数 1.v-on绑定click,执行一个函数 <input type="button" v-on:click="test" value=&quo ...
- linux下进程绑定cpu情况查看的几种方法
1.pidstat命令 查看进程使用cpu情况,如果绑定了多个cpu会都显示出来 pidstat -p `pidof 进程名` -t 1 2.top命令 (1)top (2)按f键可以选择下面配置选项 ...
- 20164319 刘蕴哲 Exp2 后门原理与实践
[后门概念] 后门就是不经过正常认证流程而访问系统的通道. 特指潜伏于操作系统中专门做后门的一个程序,而“坏人”可以连接这个程序远程执行各种指令. (概念和木马有重叠) [学习内容] 使用nc实现wi ...
- @RefreshScope 配置方法
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> < ...