1. 程式人生 > >C#元件系列——又一款Excel處理神器Spire.XLS,你值得擁有(二)

C#元件系列——又一款Excel處理神器Spire.XLS,你值得擁有(二)

前言:上篇 C#元件系列——又一款Excel處理神器Spire.XLS,你值得擁有 介紹了下元件的兩個功能,說不上特色,但確實能解決我們專案中的一些實際問題,這兩天繼續研究了下這個元件,覺得有些功能用起來還是挺方便的,這篇繼續來看看Spire.XLS的一些其他功能,說不定有你需要的呢~~

一、基礎入門

1、新建Workbook

 Spire.XLS提供了多種方式建立Workbook物件

1.1、新建空的Workbook

//新建Workbook
Workbook workbook = new Workbook();
//得到第一個Sheet頁
Worksheet sheet = workbook.Worksheets[0
]; //給A2這個單元格設定值 sheet.Range["A2"].Text = "你好,Jim" ; //儲存到物理路徑 var strFullName = @"D:\Data\Upload\" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; workbook.SaveToFile(strFullName);

就這麼簡單生成一個Excel檔案

1.2、根據物理路徑生成Workbook

//新建Workbook
Workbook workbook = new Workbook();
//將當前路徑下的檔案內容讀取到workbook物件裡面
workbook.LoadFromFile(@"D:\Data\Upload\Export20160926114559.xlsx"); //得到第一個Sheet頁 Worksheet sheet = workbook.Worksheets[0]; //給A2這個單元格設定值 sheet.Range["C5"].Text = "你好,Jim" ; //儲存到物理路徑 var strFullName = @"D:\Data\Upload\" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; workbook.SaveToFile(strFullName,ExcelVersion.Version2010);

1.3、根據檔案流生成Workbook

上篇我們演示過多次,對於Web裡面的檔案上傳,多用此方法。

//得到當前請求的檔案
var oFile = Request.Files["txt_file"];

//根據當前的檔案流生成Workbook物件
Workbook book = new Workbook();
book.LoadFromStream(oFile.InputStream);

1.4、根據Excel模板生成Workbook

這種用法適用於專案需要使用Excel模板的時候,比如我們專案需要匯出的每一個Excel都適用如下模板:

那麼,我們每次生成Excel的時候可以根據該模板去建立Workbook

//新建Workbook
Workbook workbook = new Workbook();
//根據模板生成Workbook
workbook.LoadTemplateFromFile(@"D:\Data\Upload\Template.xlsx");

這樣得到的Excel檔案將會自動套用該模板樣式。

2、讀寫Workbook

2.1、根據單元格的名稱框來讀寫Excel

關於Workbook的讀寫,上文已經提供了一種方式,形如:

sheet.Range["C5"].Text = "你好,Jim" ;

這樣就能給C5單元格賦值,如果是取值,可以直接使用同樣的方式。當然,除了Text字串的內容,元件還提供了NumberValue、DateTimeValue、BooleanValue等屬性,用於讀寫數字、時間、bool型別的值。

當然,Range除了支援基礎的單元格名稱框來讀寫值之外,它還提供了給某一個區域的文字框賦值的功能。比如

sheet.Range["C5:E6"].Value = "你好,Jim" ;

這一句表示給C5-E6這一區域的文字框統一賦值。得到結果如下:

如果需要操作當前區域的所有單元格,可以這樣:

var columes = sheet.Range["C5:E6"].Columns ;
foreach (var column in columes)
{ }

2.2、根據單元格的行列索引來讀寫Excel

除了上面的方式,元件還支援通過行列的索引去給單元格取賦值。

sheet.Range[1, 1].Text = "部門名稱";

以上一句表示給第一個行第一列單元格賦值。

3、儲存Workbook

關於Excel的儲存,元件同樣提供了多種方式。

3.1、直接儲存的方式:SaveToFile()

var strFullName = @"D:\Data\Upload\" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
workbook.SaveToFile(strFullName);

值得一提的是,SaveToFile還支援儲存不同版本的Excel,來看這個過載

public void SaveToFile(string fileName, ExcelVersion version);

ExcelVersion是一個列舉型別,定義了各種不同版本的Excel:

public enum ExcelVersion
    {
        // 摘要: 
        //     Represents excel version 2007 xlsb
        Xlsb2007 = 0,
        //
        // 摘要: 
        //     Represents excel version 2010 xlsb
        Xlsb2010 = 1,
        //
        // 摘要: 
        //     OpenOffice Spreadsheet documents
        ODS = 2,
        //
        // 摘要: 
        //     Represents excel version 97-2003.
        Version97to2003 = 3,
        //
        // 摘要: 
        //     Represents excel version 2007
        Version2007 = 4,
        Version2010 = 5,
        //
        // 摘要: 
        //     Represents excel version 2013.
        Version2013 = 6,
    }

3.2、儲存並且轉換檔案

上篇介紹Excel轉PDF的時候,我們知道元件提供了SaveToPdf()方法直接將Excel儲存成為pdf檔案,用法如下:

//儲存到物理路徑
var strFullName = @"D:\Data\Upload\" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
workbook.SaveToPdf(strFullName)

除了儲存成為pdf之外,還支援轉換成其他格式:

儲存為image

var strFullName = @"D:\Data\Upload\" + "Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";
var image = workbook.SaveAsImage(0, 100, 190);
image.Save(strFullName);

SaveAsImage()第一個引數表示需要生成圖片的Sheet頁的索引;第二、三個引數表示生成圖片的X和Y的值。

儲存為xml

workbook.SaveAsXml(strFullName);

儲存到檔案流

using (var stream = new FileStream(strFullName, FileMode.Create))
{
    workbook.SaveToStream(stream);
}

二、樣式

1、文字樣式

設定單元格字型樣式

sheet.Range["C5:E6"].Value = "aaabbbccc";
sheet.Range["C5:E6"].Style.Font.Color = Color.FromArgb(255, 125, 125);//文字顏色
sheet.Range["C5:E6"].Style.Font.IsBold = true;//字型是否加粗
sheet.Range["C5:E6"].Style.Font.IsItalic = true;//是否斜體
sheet.Range["C5:E6"].Style.Font.Underline = FontUnderlineType.Single;//下劃線
sheet.Range["C5:E6"].Style.Font.IsSuperscript = true;//是否呈現為下標
sheet.Range["C5:E6"].Style.Font.FontName = "華文彩雲";//字型名稱
sheet.Range["C5:E6"].Style.Font.Size = 30;//字型大小

得到結果

2、單元格樣式

關於單元格樣式設定

sheet.Range["C5:E6"].Style.HorizontalAlignment = HorizontalAlignType.Center;//水平對齊
sheet.Range["C5:E6"].Style.VerticalAlignment = VerticalAlignType.Center;//垂直對齊
sheet.Range["C5:E6"].ColumnWidth = 100;//單元格的寬度
sheet.Range["C5:E6"].RowHeight = 30;//行高
sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;//邊框
sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
sheet.Range["C5:E6"].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;

3、表格樣式

下面來一個奇偶行的樣式:

public static void sheetStyle(Workbook book, Worksheet sheet)
        {
            CellStyle oddStyle = book.Styles.Add("oddStyle");
            oddStyle.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
            oddStyle.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
            oddStyle.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
            oddStyle.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
            oddStyle.KnownColor = ExcelColors.LightGreen1;

            CellStyle evenStyle = book.Styles.Add("evenStyle");
            evenStyle.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
            evenStyle.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
            evenStyle.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
            evenStyle.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
            evenStyle.KnownColor = ExcelColors.LightTurquoise;


            foreach (CellRange range in sheet.AllocatedRange.Rows)
            {
                if (range.Row % 2 == 0)
                    range.CellStyleName = evenStyle.Name;
                else
                    range.CellStyleName = oddStyle.Name;
            }

            //Sets header style
            CellStyle styleHeader = sheet.Rows[0].Style;
            styleHeader.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
            styleHeader.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
            styleHeader.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
            styleHeader.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
            styleHeader.VerticalAlignment = VerticalAlignType.Center;
            styleHeader.KnownColor = ExcelColors.Green;
            styleHeader.Font.KnownColor = ExcelColors.White;
            styleHeader.Font.IsBold = true;

            sheet.Columns[sheet.AllocatedRange.LastColumn - 1].Style.NumberFormat = "\"$\"#,##0";
            sheet.Columns[sheet.AllocatedRange.LastColumn - 2].Style.NumberFormat = "\"$\"#,##0";

            sheet.AllocatedRange.AutoFitColumns();
            sheet.AllocatedRange.AutoFitRows();

            sheet.Rows[0].RowHeight = 20;
        }
SheetStyle()

效果如下:

4、富文字編輯框

除了上面的一些簡單樣式外,元件還提供了富文字的編輯方式

ExcelFont fontBold = book.CreateFont();
fontBold.IsBold = true;

ExcelFont fontUnderline = book.CreateFont();
fontUnderline.Underline = FontUnderlineType.Single;

ExcelFont fontColor = book.CreateFont();
fontColor.KnownColor = ExcelColors.Green;

RichText richText = sheet.Range["A1"].RichText;
richText.Text = "Bold and underlined and colored text";
richText.SetFont(0, 3, fontBold);
richText.SetFont(9, 18, fontUnderline);
richText.SetFont(24, 30, fontColor);

效果

當然,這個功能可能在一些特定的場合才會用上。

三、凍結行列

元件提供了非常方便凍結行列的功能。

1、凍結行

sheet.FreezePanes(2, 1);

得到結果

2、凍結列

sheet.FreezePanes(1, 2);

得到結果

程式碼釋疑:這裡的兩個引數怎麼理解,第一個引數rowIndex,第二個引數columnIndex。為什麼sheet.FreezePanes(2, 1)能凍結首行?這裡博主的理解是這裡的引數設定的是開始滑動的行和列。也就是說FreezePanes(2,1)表示從第二行、第一列開始可以滑動,而FreezePanes(1,2)表示從第一行、第二列開始可以滑動。這樣是不是會好理解一點。

四、合併單元格

關於單元格的合併,元件使用也還算方便。

var mergecolumn = sheet.Merge(sheet.Range[1, 2], sheet.Range[1, 3]);
mergecolumn.VerticalAlignment = VerticalAlignType.Center;
mergecolumn.HorizontalAlignment = HorizontalAlignType.Center;
mergecolumn.Text = "第一個合併的單元格" ;

得到結果

五、選項過濾功能

元件提供了方便的元件過濾功能

sheet.AutoFilters.Range = sheet.Range["A1:C1"];

以上表示對A1到C1這個區域的所有文字框進行過濾。效果如下:

六、下拉框

在Excel裡面,經常需要用到的一個功能就是在編輯單元格的時候使用下拉框,這樣方便了一些特定項的編輯。同樣,元件也為我們提供了這個功能

//下拉框
CellRange range = sheet.Range["A2:A6"];
//給E1到E10所有的單元格新增下拉選項,資料來源是A2到A6的值
sheet.Range["E1:E10"].DataValidation.DataRange = range;

效果如下:

七、顯示、隱藏行列

對於行列隱藏也算是一個常用功能,方法如下

//顯示、隱藏行列
sheet.HideColumn(10);
sheet.HideRow(8);
//sheet.ShowColumn(10);
//sheet.ShowRow(7);

效果

八、搜尋結果高亮

foreach (CellRange range in sheet.FindAllString("行政部", true, true))
{
       range.Style.Color = Color.LawnGreen;
}

效果如下

九、總結

至此,元件的一些基礎功能介紹完畢。當然,這並不是全部,只是博主選的一些覺得或許有用的功能,更多功能可以參考官網文件。

當然,如果本文能夠幫到你,還是希望園友們幫忙推薦,博主下次繼續努力!

歡迎各位轉載,但是未經作者本人同意,轉載文章之後必須在文章頁面明顯位置給出作者和原文連線,否則保留追究法律責任的權利

相關推薦

C#元件系列——Excel處理神器Spire.XLS值得擁有

前言:上篇 C#元件系列——又一款Excel處理神器Spire.XLS,你值得擁有 介紹了下元件的兩個功能,說不上特色,但確實能解決我們專案中的一些實際問題,這兩天繼續研究了下這個元件,覺得有些功能用起來還是挺方便的,這篇繼續來看看Spire.XLS的一些其他功能,說不定有你需要的呢~~ 一、基礎入門

C#元件系列——Excel處理神器Spire.XLS值得擁有

前言:最近專案裡面有一些對Excel操作的需求,博主想都沒想,NPOI唄,簡單、開源、免費,大家都喜歡!確實,對於一些簡單的Excel匯入、匯出、合併單元格等,它都沒啥太大的問題,但是這次的需求有兩點是NPOI搞不定的: 匯入Excel後,需要切割Excel的Sheet頁,然後每個Sheet頁單獨生成一

C#元件系列——日誌元件:Elmah的學習和分享

前言:好久沒動筆了,都有點生疏,12月都要接近尾聲,可是這月連一篇的產出都沒有,不能壞了“規矩”,今天還是來寫一篇。最近個把月確實很忙,不過每天早上還是會抽空來園子裡逛逛。一如既往,園子裡每年這個時候都有大把的年終總結、回憶過去展望未來之類的文章。博主是沒時間寫總結了,要學的東西太多。關於Vue的系列一定要抽

JS元件系列——MVVM元件:Vue:30分鐘搞定前端增刪改查

正文 前言:關於Vue框架,好幾個月之前就聽說過,瞭解一項新技術之後,總是處於觀望狀態,一直在猶豫要不要系統學習下。正好最近有點空,就去官網瞭解了下,看上去還不錯的一個元件,就抽空研究了下。最近園子裡vue也確實挺火,各種入門博文眼花繚亂,博主也不敢說寫

JS元件系列——MVVM元件:Vue:構建自己的Vue元件

前言:轉眼距離上篇 JS元件系列——又一款MVVM元件:Vue(一:30分鐘搞定前端增刪改查) 已有好幾個月了,今天打算將它撿起來,發現好久不用,Vue相關技術點都生疏不少。經過這幾個月的時間,Vue的發展也是異常迅猛,不過這好像和博主都沒什麼太大的關係,博主還是老老實實研究自己的技術吧。技術之路還很長,且行

開源圖示庫 CSS.GG值得

![](https://imgkr.cn-bj.ufileos.com/f819ad89-839d-409d-9a18-3ccd463814e8.png) 嗨,我是 `Martin`,也叫老王,今天推薦一款好用的開源圖示庫。 我們平常找圖示往往會去 [`iconfont`](https://www.ico

年沒有中國隊的世界杯還會熬夜打call嗎?網友的回答亮了

俄羅斯 .... 評論 一個 fff CA 圖片 通過 mage 作為足球界的第一盛宴,2018年俄羅斯世界杯將於明天點燃戰火,持續整整一個月。Giiso小智就想問,真球迷、假球迷、或是偽球迷,你們準備好要陷入這四年一度的狂歡了嗎? 根據公開的信息,目前可以通過央視、優酷

關於開發課程實驗軟體的專案需求分析與建議NABCD

  N(Need 需求):    目前有些大學生在做課堂實驗時因為沒有完全理解老師的意思,對實驗具體的步驟不清楚,導致真正做實驗時無從下手,無法完成實驗要求,無法達到真正的效果;或者學校無法提供足夠的實驗資源讓學生充分完成實驗,學生無法有足夠的時間去完成整個實驗。   A(Approach 做法):

manacher算法處理最長的回文子串

pub 中心 回文子串 max 最大 += public img cto 在上篇《manacher算法處理最長的回文子串(一)》解釋了manacher算法的原理,接著給該算法,該程序在leetcode的最長回文子串中通過。首先manacher算法維護3個變量。一

它是網際網路防毒軟體中的股清流功能強大值得擁有

身處網際網路的時代,網路防毒是不可避免的! 今天給大家推薦一款簡單好用的防毒軟體,火絨安全,體積小不佔記憶體,功能實用沒有任何廣告彈窗,極小的佔用執行空間,可以說是國內防毒軟體中的清流。   火絨的介面非常簡潔,目前主要包含"病毒查殺"、"防護中心"、"家長控制"、"擴充

Jmeter之處理session、cookie以及如何做關聯Jmeter如何提取響應頭部的JSESSIONID

就是利用Jmeter做介面測試的時候,如何提取頭部的JSESSIONID然後傳遞到下一個請求,繼續完成當前使用者的請求。其實,關於這個問題有三種種解決方法:3)如果響應頭裡面有這個JSESSIONID,我們可以通過新增cookie來解決這個問題,今天這篇部落格,我們重點講解第

男人襪透氣清爽耐穿值得擁有

小時候,幸福是件簡單的事情;長大後,簡單是件幸福的事情。 我們崇尚簡單的生活,所以男人襪就出現了..... 男人襪,透氣清爽,又耐穿!!! 男人襪推出商務男襪「定期送到家」服務,您可以像訂雜誌一樣定期收到男人襪寄送的襪子,

學不可以已--我年Java之路的回顧反思以及展望

說到上個暑假,還有不得不提的事就是沉迷於CSDN的論壇中。早在暑假回家之前,除了那些學習計劃,我還有一個目標就是一定要在CSDN的Java板塊變成一個紅星,因為那個時候我覺得紅星就是技術水平高的代名詞(一般初學者才有這個想法^_^),所以那個假期在CSDN回答問題可以用一個瘋狂來形容,當時基本上事每一個帖子都

7個人覺得比較出色的Python IDE值得擁有

Python作為一款比較“簡潔”的程式語言,它擁有很多價效比高的效能,造就了它現在比較火熱的局面,很多人都來學習Python。Python 的學習過程少不了 IDE 或者程式碼編輯器,或者整合的開發編輯器(IDE)。這些 Python 開發工具幫助開發者加快使用 Python 開發的速度,提高效率。

最全spring boot視訊系列值得擁有

==================================從零開始學Spring Boot視訊==================================【截止到2018.4.19共88課時】第二十章 Spring Boot 2.0:Quartz持久化:動態

7公認比較出色的Python IDE值得擁有

Python作為一款比較“簡潔”的程式語言,它擁有很多價效比高的效能,造就了它現在比較火熱的局面,很多人都來學習Python。Python 的學習過程少不了 IDE 或者程式碼編輯器,或者整合的開發編輯器(IDE)。這些 Python 開發工具幫助開發者加快使用 Python 開發的速度,提高效率。高效的程式

從原始碼中學習設計模式系列——單例模式序/反序列化以及反射攻擊的問題

一、前言 這篇文章是學習單例模式的第二篇,之前的文章一下子就給出來看起來很高大上的實現方法,但是這種模式還是存在漏洞的,具體有什麼問題,大家可以停頓一會兒,思考一下。好了,不賣關子了,下面我們來看看每種單例模式存在的問題以及解決辦法。 二、每種Singleton 模式的演進  模式一

盤沙拉”帶入門Dagger2之帶引數怎麼辦

系列文章 如果被依賴類的建構函式帶有引數,要把這個引數的型別也管理起來 現在要在Salad裡新加入一個水果Orange,但是Orange的建構函式裡需要傳入一個Knife來

python讀取excel檔案中所有sheet表格:openpyxl模組

通過openpyxl模組 迴圈遍歷excel檔案中所有sheet表格。 excel檔案 e:\\t.xlsx ,有2個sheet:   sales 客戶編碼 年月 銷售額(萬元) JLF0001 20

利用Objective-C的反射機制和執行時特性實現類靜態方法的動態訪問

繼上次的研究成果繼續深入研究,灑家又完善了下在執行時動態呼叫所有OC類方法的公用方法: typedef void*(*ObjcMsgSend)(id, SEL, ...); - (void *)invoke:(id)inst method:(NSString *)nam