一、思路:   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表格中插入饼状图(可实现动态数据生成)的更多相关文章

  1. C#调用NPOI组件导出Excel表格

    把一个List集合的数据导出到Excel表格中 public static string RenderToExcel<T>(List<T> datas) { MemoryStr ...

  2. js导出excel表格中较长数字串会变成科学计数法问题

    在做项目中,遇到导出excel表格时,银行账户号数字过长,导出的数字串变为计数法形式,如下图: 网上搜到解决方法,粘贴到这以供学习.不断更新. 原博地址:http://www.cnblogs.com/ ...

  3. C# 如何在Excel表格中插入、编辑和删除批注

    概述 为文档添加必要的批注可以给文档使用者提供重要的提示信息,下面的示例中,将介绍通过C#编程语言来给Excel表格中的指定单元格内容添加批注,此外,对于已有的批注,如果需要修改,我们也可以进行编辑或 ...

  4. NX二次开发-OLE/COM向EXCEL表格中插入图片

    今晚有一个兄弟问我怎么往EXCEL里插入图片(加工程序单中需要插入图片),这个我之前也没弄过,回复了他一句不知道,后来刚刚干完游戏吃完鸡,就去VC++的书上翻了翻,还真的被我翻到了.VC++的方法往E ...

  5. excel表格中,怎么根据一列重复的数据求对应另一列总和

    如下: 求出姓名对应分数总和对应 : 首先复制一份Sheet2 对Sheet1进行操作选中A列姓名 数据->删除重复项->以前选中区域排序->删除重复项 然后删除对应成绩项选中张三对 ...

  6. C#的WinForm中制作饼状图和柱状图

    using System; using System.IO;//用于文件存取 using System.Data;//用于数据访问 using System.Drawing;//提供画GDI+图形的基 ...

  7. 转:C# 中 MSCHART 饼状图显示百分比

    转自:http://blog.sina.com.cn/s/blog_51beaf0e0100yffo.html 1)显示百分比 Chart1.Series["Series1"].L ...

  8. JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]

    我用JFreeChart框架生成饼状图,但想把数据信息在饼图上显示,是在饼图内部(即圆内)显示!怎样实现啊??  去掉lablepieplot.setLabelGenerator(null);去掉线p ...

  9. 关于echarts中的饼状图的label文字显示过长的问题

    label: { normal: { fontSize: 14, formatter(v) { let text = v.name let count = text.indexOf('¥') cons ...

随机推荐

  1. EasyUI在window中使用kindeditor 4.1.10在IE9中不能回显、获得焦点编辑的问题

    描述 :kindeditor4.1.10版本是当前最新的版本,在浏览器兼容性和功能方面都是值得一赞的,在开发中能方便快捷的满足一些开发需求. 问题 :  问题总是有的.  在使用过程中,遇到EasyU ...

  2. 更新VS2017会出现“请更新 Visual Studio 安装程序 再继续” 提示

    在win10下 用管理员身份下再运行一次VS2017的安装程序,就好了.

  3. 【C++】C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  4. 吴裕雄 python 机器学习——线性判断分析LinearDiscriminantAnalysis

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  5. 解题(GoUpstairs -- 上楼梯)

    题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n, ...

  6. ssh连接远程主机执行脚本的环境变量问题

    近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本时,遇到一个奇怪的问题: ~/myscript.sh: line n: app: co ...

  7. Linux镜像清理日志操作

    1.安全 没有其他用户 查看 ll  /home下没有其他用户 2.清理日志 rm -rf /root/* rm -rf /tmp/* rm -rf /etc/udev/rules.d/persist ...

  8. vue props命名最好直接使用kebab-case (短横线隔开式) 命名

    vue官方解释,props使用驼峰命名的话,在html中使用时也需要转化成短横线命名,否则报错.个人比较喜欢上下文统一,直接在props命名时就把它命名成短横线隔开式吧.

  9. Codeforces Round #553 (Div. 2) B题

    题目网址:http://codeforces.com/contest/1151/problem/B 题目大意:给定一个n*m的矩阵,问是否可以从每一行中选择一个数,使得这n个数异或大于0,如果可以还要 ...

  10. SpringMVC避免IE执行AJAX,返回JSON出现下载文件