使用Epplus生成Excel 圖表

来源:http://www.cnblogs.com/Cjb8973/archive/2017/11/23/7885914.html
-Advertisement-
Play Games

1. 前言 這是我最近項目剛要的需求,然後在網上找了半天的教材 但是很不幸,有關於Epplus的介紹真的太少了,然後經過了我的不斷研究然後不斷的採坑,知道現在看到Excel都想吐的時候,終於成功的完成了公司的要求,最後我 稍微的優化了一下代碼(畢竟是個剛工作一年多的新人),現在就給大家看一看不足之處 ...


1.  前言

  這是我最近項目剛要的需求,然後在網上找了半天的教材  但是很不幸,有關於Epplus的介紹真的太少了,然後經過了我的不斷研究然後不斷的採坑,知道現在看到Excel都想吐的時候,終於成功的完成了公司的要求,最後我 稍微的優化了一下代碼(畢竟是個剛工作一年多的新人),現在就給大家看一看不足之處,希望給為大佬給以指點,稍後在後面我會給出項目下載。

//首頁執行   
DataTable dt = DBhelper.gettable();
            List<RangeData> rlist=new List<RangeData>();
            RangeData rd = new RangeData();
            rd.Charttype = "ColumnStacked";
            rd.Yaxis = "E6,G6,O6";
            rd.UserName = "測試名稱";
            rd.Region = "測試地址";
            rd.ChartName = "測試名稱";
            rd.ChartKeyword = "F36";
            rd.Appointedtime = DateTime.Now.ToString();
            rlist.Add(rd);
            RangeData rd1 = new RangeData();
            rd1.Charttype = "ColumnClustered";
            rd1.Yaxis = "E6,G6,O6";
            rd1.UserName = "測試名稱1";
            rd1.Region = "測試地址1";
            rd1.ChartName = "測試名稱1";
            rd1.ChartKeyword = "F36";
            rd1.Appointedtime = DateTime.Now.ToString();
            rlist.Add(rd1);
            RangeData rd2 = new RangeData();
            rd2.Charttype = "Pie";
            rd2.Yaxis = "E6,G6,O6";
            rd2.UserName = "測試名稱2";
            rd2.Region = "測試地址2";
            rd2.ChartName = "測試名稱2";
            rd2.ChartKeyword = "F36";
            rd2.Appointedtime = DateTime.Now.ToString();
            rlist.Add(rd2);
            RangeData rd3 = new RangeData();
            rd3.Charttype = "singleColumnClustered";
            rd3.Yaxis = "E6,G6,O6";
            rd3.UserName = "測試名稱23";
            rd3.Region = "測試地址23";
            rd3.ChartName = "測試名稱3";
            rd3.ChartKeyword = "F36";
            rd3.Appointedtime = DateTime.Now.ToString();
            rlist.Add(rd3);
            ExcelInfo.ExportClient("", dt, rlist);

public class ExcelInfo
{


     /// <summary> /// 輸出Excel文件 /// </summary> /// <param name="FileName"></param> /// <param name="table"></param> /// <param name="?"></param> public static void ExportClient(string FileName, DataTable table, List<RangeData> Rlist) { //reportTitle = "Microsoft,IBM,Oracle,Google.Yahoo"; FileName = FileName+DateTime.Now.ToString("yyyy_MM_dd_HHmmss") + ".xlsx"; // string TJcell = "D6,F6,H6,AJ6"; if (Directory.Exists("UpFiles")) { } else { DirectoryInfo directoryInfo = new DirectoryInfo("UpFiles"); directoryInfo.Create(); } FileInfo file = new FileInfo(@"D:\文檔資料\自學項目\EpplusExcelChartWeb\EpplusExcelChartWeb\upfiles\" + FileName); createExcel(file, table, Rlist); } /// <summary> /// 創建Excel Sheet /// </summary> /// <param name="file"></param> public static void createExcel(FileInfo file, DataTable table, List<RangeData> Rlist) { ExcelPackage package = new ExcelPackage(new FileStream(@"D:\文檔資料\自學項目\EpplusExcelChartWeb\EpplusExcelChartWeb\test1.xlsx", FileMode.Open)); ExcelWorksheet sheet = null; sheet = package.Workbook.Worksheets[1]; #region 設置Excel數據 SheetData(table, sheet); #endregion //設置圖形 if (Rlist.Count > 0) { ExcelWorksheet sheet1 = null; sheet1 = package.Workbook.Worksheets.Add("Data"); for (int i = 0; i < Rlist.Count; i++) { SheetData(table, sheet1); sheet.Cells["C3"].Value = Rlist[i].UserName; sheet.Cells["C4"].Value = Rlist[i].Region; sheet.Cells["O4"].Value = Rlist[i].Appointedtime; if (Rlist[i].Charttype == "ColumnStacked") { //堆積柱形圖 ColumnStacked(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName,Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "ColumnClustered") { //簇狀柱形圖 ColumnClustered(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "Pie") { //餅圖 Pie(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "singleColumnClustered") { singleColumnClustered(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } } } else { System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert('沒有數據')</script>"); } package.SaveAs(file);//保存文件 } //工作簿數據 private static void SheetData(DataTable table, ExcelWorksheet sheet) { //if (cols[0] != "") //{ // //設置列標題 // for (int col = 1; col <= cols.Length; col++) // { // sheet.Cells[1, col].Value = cols[col - 1]; // } //} //else //{ //設置列標題 //for (int col = 1; col <= table.Columns.Count; col++) //{ // sheet.Cells[1, col].Value = table.Columns[col - 1].ColumnName; //} //} //設置數據 for (int row = 0; row < table.Rows.Count; row++) { for (int col = 0; col < table.Columns.Count; col++) { string range = sheet.MergedCells[row + 7, col + 2]; string strvalue = table.Rows[row][col].ToString(); // sheet.Cells[row + 1, col].Style.Numberformat.Format = "#0\\.00%";//設置數據的格式為百分比 if (table.Rows[row]["F36"].ToString() != "") { sheet.Cells[row + 7, col + 2].Style.Fill.PatternType = ExcelFillStyle.Solid; sheet.Cells[row + 7, col + 2].Style.Fill.BackgroundColor.SetColor(Color.Gray); sheet.Cells[row + 7, col + 2].Value = strvalue; } sheet.Cells[row + 7, col + 2].Value = strvalue; } } } /// <summary> /// 堆積柱形圖 /// </summary> private static void ColumnStacked(DataTable table,ExcelWorksheet sheet, string TJCell,string Chartname,string ChartKeyword) { ////圖表系列 ExcelChartSerie chartSerie = null; //圖表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnStacked); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//設置圖表大小 chart.ShowHiddenData = true; #region 規定單元格生成圖表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//設置每條線的名稱 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36"); chart.SetPosition(table.Rows.Count + 7, 10, 1, 20);//設置圖表位置 } /// <summary> /// 多條簇狀柱形圖 /// </summary> private static void ColumnClustered(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////圖表系列 ExcelChartSerie chartSerie = null; //圖表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnClustered); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//設置圖表大小 chart.ShowHiddenData = true; #region 規定單元格生成圖表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//設置每條線的名稱 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36"); chart.SetPosition(table.Rows.Count + 7, 10, 10, 20);//設置圖表位置 } /// <summary> ///餅圖 /// </summary> private static void Pie(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////圖表系列 ExcelChartSerie chartSerie = null; //圖表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.Pie); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//設置圖表大小 chart.ShowHiddenData = true; #region 規定單元格生成圖表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//設置每條線的名稱 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36"); chart.SetPosition(table.Rows.Count + 7+25, 10, 1, 20);//設置圖表位置 } /// <summary> /// 單條簇狀柱形圖 /// </summary> private static void singleColumnClustered(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////圖表系列 ExcelChartSerie chartSerie = null; //圖表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnClustered); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//設置圖表大小 chart.ShowHiddenData = true; #region 規定單元格生成圖表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//設置每條線的名稱 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36"); chart.SetPosition(table.Rows.Count + 7 + 25, 10, 10, 20);//設置圖表位置 } /// <summary> /// 提取字元串 /// </summary> /// <param name="p_str"></param> /// <returns></returns> public static string GetEXcelstr(string p_str) { string strReturn = string.Empty; if (p_str == null || p_str.Trim() == "") { strReturn = ""; } foreach (char chrTemp in p_str) { if (!Char.IsNumber(chrTemp)) { strReturn += chrTemp; } } return strReturn; }
}
//RangeData類

 public class RangeData  
    {
        /////  <param name="XStartCell">數據開始單元格</param>
        //public  string XStartCell { get; set; }
        //  ///   <param name="XEndCell">數據結束單元格</param>
        //public  string XEndCell { get; set; }
        //  ///    <param name="EduName">Y開始單元格</param>
        //public  string YStartCell { get; set; }
        //  ///     <param name="EduName">Y結束單元格</param>
        //public  string YEndCell { get; set; }
        //圖表類型 1.ColumnStacked 堆積柱形圖 2.ColumnClustered 多條簇狀柱形圖 3.Pie餅圖4.singleColumnClustered 單條簇狀圖
        public string Charttype { get; set; }
        //指定Y軸分類標簽
        public string Yaxis { get; set; }
        //用戶名
        public string UserName { get; set; }
        //所在區域
        public string Region { get; set; }
        //指定時間
        public string Appointedtime { get; set; }
        //圖表名稱
        public string ChartName { get; set; }
        //製圖關鍵字
        public string ChartKeyword { get; set; }

    }

 如果執行報錯 可能是獲取Excel文件地址的問題。

 

下載地址https://files.cnblogs.com/files/Cjb8973/EpplusExcelChartWeb.rar


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上面的代碼是我們在使用繼承時,子類和父類的構造函數的寫法。構造方法能否被繼承,我覺得應該這樣理解: 父類是對子類的抽象,也就是說父類和子類可以合併寫成一個類,合併後的類寫出來的構造函數,不僅會包含子類的構造函數的內容,還會包含父類的構造函數的內容,所以我覺得這裡不能看成是子類繼承父類的構造函數,看成 ...
  • Q:i want to pass my List as parameter using my eventpublic event EventHandler _newFileEventHandler; List _filesList = new List();public void startList... ...
  • 現在說一下程式處理部分,有點長 本來是想做針對doc和docx的模板兩個版本, 後來想到可以在生成的時候saveas里設置格式, 所以此版只支持對docx的模板處理, 想要doc的情況可以選擇生成格式為doc的. 上代碼: public class WordHelper { private Word ...
  • 既然是模板就少不了各種標記和配置. 這裡主要用到了word的書簽功能. 打開word按ctrl+shift+F5, 打開書簽功能 如下圖 如果所示, 可以選中word中的一個區域然後按ctrl+shift+F5, 對此部分添加一個書簽 是否理解為這樣是為這部分區域添加了指針? 根據圖中的操作就可以明 ...
  • 還是以學生、語文、數學、分數為例吧, 感覺這個和helloworld都有一拼了. 造一張表如下, 整張報表就圍繞這個表轉圈了, 順便說下就是名字如有雷同純屬巧合 新建個存儲過程 ALTER PROCEDURE [dbo].[StudentReport] AS BEGIN select 學期,max( ...
  • using System.Linq; List<string> ListA = new List<string>(); List<string> ListB = new List<string>(); List<string> ListResult = new List<string>(); Lis ...
  • 經常遇到這樣的需求, 生成Word格式的報告, 而不是單純的一張表格的報表. 就像體檢報告一樣. 數據來源部分決定採用一個存儲過程返回Dataset的方式, 整張報告的數據來源於此Dataset的多個Datatable. 首先通過配置文件遍歷Dataset生成Word文檔, 但這就意味著要配置的內容 ...
  • HiLo是在NHiernate中生成主鍵的一種方式,不過現在我們可以在Entity Framework Core中使用。所以在這篇內容中,我將向您在如何使用HiL在Entity Framework Core生成主鍵。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...