.Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式
1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表)
2 Epplus 的安装和引用
新建一个工程文件或控制台应用程序 打开 Vs2017 Tools 的Nuget 包管理器,使用命令 install-package Epplus

3 开始在创建的工程中编写代码,实现功能

4 具体实现流程代码如下:
1 using OfficeOpenXml;
2 using OfficeOpenXml.Drawing;
3 using OfficeOpenXml.Drawing.Chart;
4 using OfficeOpenXml.Style;
5 using System;
6 using System.Collections.Generic;
7 using System.Drawing;
8 using System.IO;
9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12
13 namespace EpplusTest
14 {
15 public class Program
16 {
17 static void Main(string[] args)
18 {
19 FileInfo newFile = new FileInfo(@"d:\test.xlsx");
20 if (newFile.Exists)
21 {
22 newFile.Delete();
23 newFile = new FileInfo(@"d:\test.xlsx");
24 }
25
26 using (ExcelPackage package = new ExcelPackage(newFile))
27 {
28 #region 创建多个Sheet页
29 for (int i = 0; i < 5; i++)
30 {
31 package.Workbook.Worksheets.Add("Demo" + i);
32 }
33 ExcelWorksheet worksheet = package.Workbook.Worksheets["Demo0"];
34 ExcelWorksheet worksheet1 = package.Workbook.Worksheets["Demo1"];
35
36 #endregion
37
38 #region 1 模拟填充数据
39 worksheet1.Cells[1, 1].Value = "名称";
40 worksheet1.Cells[1, 2].Value = "价格";
41 worksheet1.Cells[1, 3].Value = "销量";
42
43 worksheet1.Cells[2, 1].Value = "苹果";
44 worksheet1.Cells[2, 2].Value = 56;
45 worksheet1.Cells[2, 3].Value = 100;
46
47 worksheet1.Cells[3, 1].Value = "华为";
48 worksheet1.Cells[3, 2].Value = 45;
49 worksheet1.Cells[3, 3].Value = 150;
50
51 worksheet1.Cells[4, 1].Value = "小米";
52 worksheet1.Cells[4, 2].Value = 38;
53 worksheet1.Cells[4, 3].Value = 130;
54
55 worksheet1.Cells[5, 1].Value = "OPPO";
56 worksheet1.Cells[5, 2].Value = 22;
57 worksheet1.Cells[5, 3].Value = 200;
58 #endregion
59
60 #region 2 构造图表
61 worksheet.Cells.Style.WrapText = true;
62 worksheet.View.ShowGridLines = false;//去掉sheet的网格线
63 using (ExcelRange range = worksheet.Cells[1, 1, 5, 3])
64 {
65 range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
66 range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
67 }
68
69 using (ExcelRange range = worksheet.Cells[1, 1, 1, 3])
70 {
71 range.Style.Font.Bold = true;
72 range.Style.Font.Color.SetColor(Color.White);
73 range.Style.Font.Name = "微软雅黑";
74 range.Style.Font.Size = 12;
75 range.Style.Fill.PatternType = ExcelFillStyle.Solid;
76 range.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(128, 128, 128));
77 }
78
79 worksheet1.Cells[1, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
80 worksheet1.Cells[1, 2].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
81 worksheet1.Cells[1, 3].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
82
83 worksheet1.Cells[2, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
84 worksheet1.Cells[2, 2].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
85 worksheet1.Cells[2, 3].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
86
87 worksheet1.Cells[3, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
88 worksheet1.Cells[3, 2].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
89 worksheet1.Cells[3, 3].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
90
91 worksheet1.Cells[4, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
92 worksheet1.Cells[4, 2].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
93 worksheet1.Cells[4, 3].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
94
95 worksheet1.Cells[5, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
96 worksheet1.Cells[5, 2].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
97 worksheet1.Cells[5, 3].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));
98
99 ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnClustered);
100 ExcelChartSerie serie = chart.Series.Add(worksheet1.Cells[2, 3, 5, 3], worksheet1.Cells[2, 1, 5, 1]);//引用worksheet1的数据填充图表的X轴和Y轴
101 serie.HeaderAddress = worksheet1.Cells[1, 3];
102 #endregion
103
104 #region 3 设置图表的样式
105 chart.SetPosition(40, 10);
106 chart.SetSize(500, 300);
107 chart.Title.Text = "销量走势";
108 chart.Title.Font.Color = Color.FromArgb(89, 89, 89);
109 chart.Title.Font.Size = 15;
110 chart.Title.Font.Bold = true;
111 chart.Style = eChartStyle.Style15;
112 chart.Legend.Border.LineStyle = eLineStyle.SystemDash;
113 chart.Legend.Border.Fill.Color = Color.FromArgb(217, 217, 217);
114 #endregion
115 package.Save();
116 }
117 }
118 }
119 }
5 效果展示:


6 Demo源码GitHub下载地址:https://github.com/HJ520134/.NetDemo.git
.net工具类 分享一个简单的随机分红包的实现方式
废话不多说,直接上代码
/// <summary>
/// 分红包
/// </summary>
public class RandomMoney
{
public RandomMoney(double totalMoney, int totalCount)
{
RemainMoney = totalMoney;
RemainCount = totalCount;
}
/// <summary>
/// 剩下的金额
/// </summary>
private double RemainMoney { get; set; }
/// <summary>
/// 剩下的次数
/// </summary>
private double RemainCount { get; set; }
private Random r = new Random();
/// <summary>
/// 获取当次红包的金额
/// </summary>
/// <returns></returns>
public double GetRandomMoney()
{
if (RemainCount < 1)
throw new Exception("红包已经抢完了");
if (RemainCount == 1)//最后一次
{
RemainCount--;
return (double)Math.Round(RemainMoney * 100) / 100;
}
double min = 0.01;
double max = RemainMoney / RemainCount * 2;
double money = r.NextDouble() * max;//随机收取本次金额
money = money <= min ? 0.01 : money;//判断最小值
money = Math.Floor(money * 100) / 100;
RemainCount--;//红包个数递减
RemainMoney = RemainMoney - money;//计算剩余金额
return money;//返回本次领取金额
}
}
下面写个demo测试一下。
class Program
{
static void Main(string[] args)
{
double totalMoney = 200;
int totalCount = 10;
RandomMoney random = new RandomMoney(totalMoney, totalCount);
for (int i = 0; i < totalCount; i++)
{
Console.WriteLine($"第{i + 1}个红包:{random.GetRandomMoney()}元");
}
Console.ReadKey();
}
}
上面的案例是一个200块钱的红包分10份,打印结果如下

这种分红包的方式有一个缺陷,就是 红包的金额 <= 剩下的金额 / 剩下的次数
大家有没有更好的分红包方式呢


浙公网安备 33010602011771号