c#使用VBA方法在Excel中绘制饼图(Pie Chart)
这两天客户有个需求让在EXCEL中生成饼图,上网搜了下,写了个代码。
效果如图:
上代码:

1 using System; 2 3 using System.Collections.Generic; 4 5 using System.Text; 6 7 using System.IO; 8 9 using System.Data; 10 11 using System.Reflection; 12 using Microsoft.Office.Core; 13 14 15 namespace ExcelGraph 16 { 17 18 class Program 19 { 20 21 private static string strCurrentPath = @"D:\Code\"; 22 23 private static string title = "testGraph"; 24 25 static void Main(string[] args) 26 { 27 28 Console.WriteLine("begin"); 29 30 Program p = new Program(); 31 32 p.CreateExcel("TestGraph", "TestGraph.xlsx", "TestGraph"); 33 34 Console.WriteLine("done"); 35 36 } 37 38 39 40 41 42 private void CreateExcel(string title, string fileName, string sheetNames) 43 { 44 //待生成的文件名称 45 string FileName = fileName; 46 47 string FilePath = strCurrentPath + FileName; 48 49 FileInfo fi = new FileInfo(FilePath); 50 51 if (fi.Exists) //判断文件是否已经存在,如果存在就删除! 52 { 53 54 fi.Delete(); 55 56 } 57 58 if (sheetNames != null && sheetNames != "") 59 { 60 61 Microsoft.Office.Interop.Excel.Application m_Excel = new Microsoft.Office.Interop.Excel.Application();//创建一个Excel对象(同时启动EXCEL.EXE进程) 62 63 m_Excel.SheetsInNewWorkbook = 1;//工作表的个数 64 65 Microsoft.Office.Interop.Excel._Workbook m_Book = (Microsoft.Office.Interop.Excel._Workbook)(m_Excel.Workbooks.Add(Missing.Value));//添加新工作簿 66 67 Microsoft.Office.Interop.Excel._Worksheet m_Sheet = (Microsoft.Office.Interop.Excel._Worksheet)(m_Excel.Worksheets.Add(Missing.Value)); 68 69 #region 处理 70 71 DataTable auto = new DataTable(); 72 73 auto.Columns.Add("LaunchName"); 74 75 auto.Columns.Add("Usage"); 76 77 auto.Rows.Add(new Object[] { "win8 apac","100" }); 78 auto.Rows.Add(new Object[] { "win8 china", "200" }); 79 auto.Rows.Add(new Object[] { "win8 india", "300" }); 80 // DataSet ds = ScData.ListData("exec Vote_2008.dbo.P_VoteResult_Update " + int.Parse(fdate)); 81 DataTableToSheet(title, auto, m_Sheet, m_Book, 1); 82 83 #endregion 84 85 #region 保存Excel,清除进程 86 87 m_Book.SaveAs(FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 88 89 //m_Excel.ActiveWorkbook._SaveAs(FilePath, Excel.XlFileFormat.xlExcel9795, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null); 90 91 m_Book.Close(false, Missing.Value, Missing.Value); 92 93 m_Excel.Quit(); 94 95 System.Runtime.InteropServices.Marshal.ReleaseComObject(m_Book); 96 97 System.Runtime.InteropServices.Marshal.ReleaseComObject(m_Excel); 98 99 m_Book = null; 100 101 m_Sheet = null; 102 103 m_Excel = null; 104 105 GC.Collect(); 106 107 //this.Close();//关闭窗体 108 109 #endregion 110 111 } 112 113 } 114 115 116 /// <summary> 117 118 /// 将DataTable中的数据写到Excel的指定Sheet中 119 120 /// </summary> 121 122 /// <param name="dt"></param> 123 124 /// <param name="m_Sheet"></param> 125 126 public void DataTableToSheet(string title, DataTable dt, Microsoft.Office.Interop.Excel._Worksheet m_Sheet, 127 128 Microsoft.Office.Interop.Excel._Workbook m_Book, int startrow) 129 { 130 //以下是填写EXCEL中数据 131 132 Microsoft.Office.Interop.Excel.Range range = m_Sheet.get_Range(m_Sheet.Cells[1, 1], m_Sheet.Cells[1, 2]); 133 // range.MergeCells = true; //合并单元格 134 135 range.Font.Bold = true; //加粗单元格内字符 136 137 //写入题目 138 139 m_Sheet.Cells[startrow, startrow] = title; 140 141 int rownum = dt.Rows.Count;//行数 142 143 int columnnum = dt.Columns.Count;//列数 144 145 int num = rownum + 2; //得到数据中的最大行数 146 147 //写入列标题 148 149 for (int j = 0; j < columnnum; j++) 150 { 151 152 int bt_startrow = startrow + 1; 153 154 //将字段名写入文档 155 156 m_Sheet.Cells[bt_startrow, 1 + j] = dt.Columns[j].ColumnName; 157 158 //单元格内背景色 159 m_Sheet.get_Range(m_Sheet.Cells[bt_startrow, 1 + j], m_Sheet.Cells[bt_startrow, 1 + j]).Interior.ColorIndex = 15; 160 161 } 162 163 //逐行写入数据 164 165 for (int i = 0; i < rownum; i++) 166 { 167 168 for (int j = 0; j < columnnum; j++) 169 { 170 171 m_Sheet.Cells[startrow + 2 + i, 1 + j] = dt.Rows[i][j].ToString(); 172 173 } 174 175 } 176 177 m_Sheet.Columns.AutoFit(); 178 179 //在当前工作表中根据数据生成图表 180 181 CreateChart(m_Book, m_Sheet, num); 182 183 } 184 185 186 187 private void CreateChart(Microsoft.Office.Interop.Excel._Workbook m_Book, Microsoft.Office.Interop.Excel._Worksheet m_Sheet, int num) 188 { 189 190 Microsoft.Office.Interop.Excel.Range oResizeRange; 191 192 Microsoft.Office.Interop.Excel.Series oSeries; 193 194 m_Book.Charts.Add(Missing.Value, Missing.Value, 1, Missing.Value); 195 m_Book.ActiveChart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlPie;//设置图形 196 197 //设置数据取值范围 198 199 m_Book.ActiveChart.SetSourceData(m_Sheet.get_Range("A2", "B" + num.ToString()), Microsoft.Office.Interop.Excel.XlRowCol.xlColumns); 200 201 m_Book.ActiveChart.Location(Microsoft.Office.Interop.Excel.XlChartLocation.xlLocationAutomatic, title); 202 203 //以下是给图表放在指定位置 204 205 m_Book.ActiveChart.Location(Microsoft.Office.Interop.Excel.XlChartLocation.xlLocationAsObject, m_Sheet.Name); 206 207 oResizeRange = (Microsoft.Office.Interop.Excel.Range)m_Sheet.Rows.get_Item(10, Missing.Value); 208 209 m_Sheet.Shapes.Item("Chart 1").Top = 0; //调图表的位置上边距 210 oResizeRange = (Microsoft.Office.Interop.Excel.Range)m_Sheet.Columns.get_Item(5, Missing.Value); //调图表的位置左边距 211 m_Sheet.Shapes.Item("Chart 1").Left = (float)(double)oResizeRange.Left; 212 m_Sheet.Shapes.Item("Chart 1").Width = 432; //调图表的宽度 213 m_Sheet.Shapes.Item("Chart 1").Height = 300; //调图表的高度 214 //m_Book.ActiveChart.PlotArea.Interior.Color = "blue"; //设置绘图区的背景色 215 m_Book.ActiveChart.PlotArea.Border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone;//设置绘图区边框线条 216 m_Book.ActiveChart.PlotArea.Width = 400; 217 m_Book.ActiveChart.PlotArea.Height = 300; 218 m_Book.ActiveChart.PlotArea.Top = 30; 219 m_Book.ActiveChart.PlotArea.Left = 0; 220 // m_Book.ActiveChart.ChartArea.Interior.ColorIndex = 10; //设置整个图表的背影颜色 221 // m_Book.ActiveChart.ChartArea.Border.ColorIndex = 8;// 设置整个图表的边框颜色 222 m_Book.ActiveChart.ChartArea.Border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;//设置边框线条 223 m_Book.ActiveChart.HasDataTable = false; 224 m_Book.ActiveChart.HasTitle = true; 225 m_Book.ActiveChart.HasLegend = true; 226 m_Book.ActiveChart.Shapes.AddLabel(MsoTextOrientation.msoTextOrientationHorizontal, 0, 0, 50, 50); 227 228 //设置Legend图例的位置和格式 229 //m_Book.ActiveChart.Legend.Top = 50; //具体设置图例的上边距 230 m_Book.ActiveChart.Legend.Left = 410;//具体设置图例的左边距 231 m_Book.ActiveChart.Legend.Interior.ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexNone; 232 m_Book.ActiveChart.Legend.Width = 100; 233 m_Book.ActiveChart.Legend.Font.Size = 12; 234 m_Book.ActiveChart.Legend.Font.Bold = true; 235 m_Book.ActiveChart.Legend.Position = Microsoft.Office.Interop.Excel.XlLegendPosition.xlLegendPositionCorner;//设置图例的位置 236 m_Book.ActiveChart.Legend.Border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone;//设置图例边框线条 237 238 oSeries = (Microsoft.Office.Interop.Excel.Series)m_Book.ActiveChart.SeriesCollection(1); 239 240 oSeries.Border.ColorIndex = 45; 241 oSeries.Border.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin; 242 243 } 244 245 } 246 247 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?