zoukankan      html  css  js  c++  java
  • c#使用VBA方法在Excel中绘制饼图(Pie Chart)

    这两天客户有个需求让在EXCEL中生成饼图,上网搜了下,写了个代码。

    效果如图:

    上代码:

    View Code
      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 }
  • 相关阅读:
    memcached+狀態模式+工廠方法使用
    狀態模式
    UML类图
    Quartz.NET
    第四次作业---计算器的第二步
    做 fzu oj 1106 题目学到的
    做fzu oj 1045 做减法学到的sprintf()函数
    第三次补作业
    第三次作业随笔(new)包含了补作业
    远征系列---离港篇(学杂记)
  • 原文地址:https://www.cnblogs.com/luzhihua55/p/2738346.html
Copyright © 2011-2022 走看看