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 ...
随机推荐
- windows中,VS2017下,在Cmake中添加OpenCV依赖
OpenCV_DIR -----D:/OpenCV/3.3.0/opencv/build/x64/vc14/lib 只有这个目录 cmake才认..貌似是因为找到了对应的OpenCvConfig.c ...
- python学习Day9 内存管理
复习 :文件处理 1. 操作文件的三步骤:-- 打开文件:此时该文件在硬盘的空间被操作系统持有 | 文件对象被应用程序持用 -- 操作文件:读写操作 -- 释放文件:释放操作系统对文件在硬盘间的持有 ...
- ajax原生实现
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- linux 下oracle导入dmp文件
2017年08月01日 19:10:49 xuxie13 阅读数:17788 最近要到某公司进行poc演示,整了个新项目,需要我数据库修改项目,这才有了这篇博客. 首先进入linux下oracle ...
- 每日笔记-redis的理解及相关应用
原文链接:常见面试题 本文大纲与之类似,在其基础上加入了自己在实际项目中对部分知识点的理解 Q1:谈谈对redis的理解 Q2:谈谈实际应用中怎么用redis的 2.1 缓存 2.2 分布式锁 2.3 ...
- Java框架spring 学习笔记(十):bean管理(注解和配置文件混合使用)
配置文件和注解混合使用 创建对象操作使用配置文件方式实现 注入属性的操作使用注解方式实现 编写BookDao.java和OrderDao.java文件 BookDao.java package com ...
- 《Orange‘s》 Bochs环境配置
安装配置bochs之前先写一个简单的引导扇区用来测试: org 07c00h mov ax,cs mov ds,ax mov es,ax call DispStr jmp $ DispStr: mov ...
- 【java】多个对象的序列化和反序列化
当我们需要序列化多个对象的时候,可以采用集合把多个对象放到集合中,然后序列化整个集合. 而我们要反序列化的时候,就使用集合接收反序列化后的对象 如: List<Student> stude ...
- model 字段参数 choice
class Banner(NewsBase): ''' 轮播图 ''' PRI_CHOICES = [ # 优先级的限制选择范围 (1,'第一级'), (2,'第二级'), (3,'第三级'), (4 ...
- antd-react-mobile(踩坑记录)
1.按照官网步骤进行, $ npm install -g create-react-app # 注意:工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试 ...