.NET利用C#字節(jié)流動態(tài)操作Excel文件
在.NET開發(fā)中,通過字節(jié)流動態(tài)操作Excel文件提供了一種高效且靈活的方式處理數(shù)據(jù)。這種方法允許開發(fā)者直接在內(nèi)存中創(chuàng)建、修改和保存Excel文檔,無需依賴直接的文件儲存、讀取操作,從而提高了程序的性能和安全性。使用流技術(shù)處理Excel不僅簡化了數(shù)據(jù)操作流程,還支持更簡便的并發(fā)處理和臨時數(shù)據(jù)管理,使應(yīng)用程序能夠更好地適應(yīng)各種數(shù)據(jù)處理需求。本文將演示如何在.NET平臺使用C#通過字節(jié)流創(chuàng)建、讀取、編輯及保存Excel文件。
本文所使用的方法需要用到免費的Free Spire.XLS for .NET,NuGet:Install-Package FreeSpire.XLS
。
用C#創(chuàng)建并保存Excel工作簿為字節(jié)流
我們可以通過創(chuàng)建Workbook實例直接創(chuàng)建Excel工作簿,然后在其中添加數(shù)據(jù)及設(shè)置格式,最后使用Workbook.SaveToStream()方法將其保存為字節(jié)流。注意新建的Excel工作簿包含三個默認(rèn)的工作表。以下是操作步驟示例:
創(chuàng)建Workbook實例。
通過Workbook.Worksheets[]屬性訪問工作簿。
定義或讀取用于制作表格數(shù)據(jù),如使用DataTable創(chuàng)建一個數(shù)據(jù)表。
使用Workbook.InsertDataTable()插入數(shù)據(jù)到工作表中,或通過Worksheet.Range[].Value屬性直接為單元格添加數(shù)據(jù)。
通過CellRange.Style中的屬性為單元格設(shè)置格式。
使用Worksheet.AutoFitColumn()方法自動調(diào)整列寬。
使用Workbook.SaveToStream()方法將Excel工作簿保存到新建的字節(jié)流或已有的字節(jié)流。
代碼示例
using Spire.Xls; using System.Data; using System.Drawing; namespace CreateExcelStream { class Program { static void Main(string[] args) { // 創(chuàng)建一個新的工作簿實例 Workbook workbook = new Workbook(); // 獲取工作簿中的第一個工作表 Worksheet sheet = workbook.Worksheets[0]; // 創(chuàng)建并填充一個包含示例數(shù)據(jù)的 DataTable DataTable table = new DataTable("員工信息"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("姓名", typeof(string)); table.Columns.Add("性別", typeof(string)); table.Columns.Add("職位", typeof(string)); table.Columns.Add("部門", typeof(string)); table.Columns.Add("工資", typeof(decimal)); table.Columns.Add("入職日期", typeof(DateTime)); table.Rows.Add(1, "張偉", "男", "軟件工程師", "研發(fā)部", 75000, DateTime.Parse("2020-03-15")); table.Rows.Add(2, "李娜", "女", "項目經(jīng)理", "項目管理辦公室", 85000, DateTime.Parse("2019-06-22")); table.Rows.Add(3, "王芳", "女", "用戶體驗設(shè)計師", "設(shè)計部", 70000, DateTime.Parse("2021-04-05")); table.Rows.Add(4, "趙強(qiáng)", "男", "系統(tǒng)分析師", "信息技術(shù)部", 80000, DateTime.Parse("2018-07-11")); table.Rows.Add(5, "孫麗", "女", "市場營銷專員", "市場部", 60000, DateTime.Parse("2022-01-03")); table.Rows.Add(6, "周勇", "男", "銷售代表", "銷售部", 65000, DateTime.Parse("2020-09-10")); table.Rows.Add(7, "吳敏", "女", "財務(wù)會計", "財務(wù)部", 72000, DateTime.Parse("2017-11-28")); table.Rows.Add(8, "鄭濤", "男", "人力資源經(jīng)理", "人力資源部", 82000, DateTime.Parse("2016-05-18")); table.Rows.Add(9, "馮靜", "女", "法律顧問", "法務(wù)部", 90000, DateTime.Parse("2015-02-14")); table.Rows.Add(10, "陳浩", "男", "首席執(zhí)行官", "高層管理", 120000, DateTime.Parse("2014-08-01")); // 將 DataTable 中的數(shù)據(jù)插入到工作表中 sheet.InsertDataTable(table, true, 1, 1); // 格式化工作表 // 設(shè)置表頭行的樣式 sheet.Rows[0].Style.Color = Color.FromArgb(229, 243, 251); sheet.Rows[0].Style.Font.FontName = "宋體"; sheet.Rows[0].Style.Font.Size = 14f; sheet.Rows[0].BorderAround(); // 給表頭行添加外邊框 sheet.Rows[0].Borders.Color = Color.FromArgb(180, 180, 180); // 設(shè)置邊框顏色 // 設(shè)置數(shù)據(jù)行的樣式 for (int i = 1; i < sheet.AllocatedRange.Rows.Count(); i++) { sheet.Rows[i].Style.Color = Color.FromArgb(247, 252, 255); sheet.Rows[i].Style.Font.FontName = "宋體"; sheet.Rows[i].Style.Font.Size = 12f; // 更改偶數(shù)行背景色 if ((i + 1) %2 == 0) { sheet.Rows[i].Style.Color = Color.FromArgb(255, 255, 255); } } sheet.Range[2, 1, sheet.Rows.Count(), sheet.Columns.Count()].BorderInside(); // 添加數(shù)據(jù)行單元格內(nèi)邊框 sheet.Range[2, 1, sheet.Rows.Count(), sheet.Columns.Count()].Borders.Color = Color.FromArgb(220, 220, 220); // 設(shè)置邊框顏色 // 調(diào)整列寬以適應(yīng)內(nèi)容 for (int j = 1; j <= sheet.AllocatedRange.Columns.Count(); j++) { sheet.AutoFitColumn(j); } // 將工作簿保存到內(nèi)存流 MemoryStream stream = new MemoryStream(); workbook.SaveToStream(stream, FileFormat.Version2016); // 將流內(nèi)容寫入到文件 File.WriteAllBytes("output/通過流創(chuàng)建Excel文件.xlsx", stream.ToArray()); // 釋放資源 workbook.Dispose(); } } }
結(jié)果
用C#通過字節(jié)流直接讀取Excel文件數(shù)據(jù)
我們可以使用Workbook.LoadFromStream()將Excel文件流載入到Workbook實例,然后使用Workbook.Worksheets[]屬性訪問工作表以及Worksheet.Range[].Value屬性訪問單元格數(shù)據(jù),從而直接讀取其數(shù)據(jù)用于進(jìn)行進(jìn)一步操作。以下是操作步驟示例:
創(chuàng)建Workbook實例。
使用Workbook.LoadFromStream()方法從新建的字節(jié)流或已有的字節(jié)流載入Excel工作簿。
通過Workbook.Worksheets[]屬性訪問指定工作表。
遍歷工作表已使用的單元格范圍的行和列,通過Worksheet.Range[].Value屬性獲取單元格數(shù)據(jù)。
輸出獲取到的數(shù)據(jù),或?qū)?shù)據(jù)用于其他操作。
代碼示例
using Spire.Xls; namespace LoadExcelStream { class Program { static void Main(string[] args) { // 創(chuàng)建一個 Workbook 類的實例 Workbook workbook = new Workbook(); // 創(chuàng)建一個內(nèi)存流 MemoryStream stream = new MemoryStream(); File.OpenRead("output/通過流創(chuàng)建Excel文件.xlsx").CopyTo(stream); // 從內(nèi)存流加載 Excel 文件 workbook.LoadFromStream(stream); // 獲取工作簿中的第一個工作表 Worksheet sheet = workbook.Worksheets[0]; // 初始化一個列表,用于存儲從工作表中提取的數(shù)據(jù) List<List<string>> data = new List<List<string>>(); for (int i = 0; i < sheet.AllocatedRange.Rows.Count(); i++) { // 創(chuàng)建一個列表來存儲每行數(shù)據(jù) List<string> lines = new List<string>(); for (int j = 0; j < sheet.AllocatedRange.Columns.Count(); j++) { // 獲取單元格的值并添加到當(dāng)前行的列表中 lines.Add(sheet.AllocatedRange[i + 1, j + 1].Value); } // 將當(dāng)前行的數(shù)據(jù)添加到數(shù)據(jù)列表中 data.Add(lines); } // 打印提取的數(shù)據(jù),或?qū)⑵溆糜诤罄m(xù)操作 foreach (List<string> lines in data) { Console.WriteLine(string.Join(" | ", lines)); } } } }
結(jié)果
用C#通過字節(jié)流編輯Excel工作簿
通過使用Workbook的LoadFromStream方法,我們可以從字節(jié)流載入Excel工作簿,然后再使用庫中的其他方法和屬性對工作簿內(nèi)容進(jìn)行編輯。在完成編輯后,再使用SaveToStream方法將工作簿保存回字節(jié)流,就可以實現(xiàn)只通過字節(jié)流對Excel文件進(jìn)行編輯操作。以下是操作步驟示例:
創(chuàng)建Workbook實例。
使用Workbook.LoadFromStream()方法從新建的字節(jié)流或已有的字節(jié)流載入Excel工作簿。
通過Workbook.Worksheets[]屬性訪問指定工作表。
通過CellRange的Style、Value等屬性對單元格或單元格范圍進(jìn)行編輯。
使用使用Workbook.SaveToStream()方法將Excel工作簿保存回字節(jié)流。
釋放資源。
代碼示例
using Spire.Xls; using System.Drawing; namespace ModifyExcelStream { class Program { static void Main(string[] args) { // 創(chuàng)建 Workbook 類的一個新實例 Workbook workbook = new Workbook(); // 創(chuàng)建一個內(nèi)存流 MemoryStream stream = new MemoryStream(); File.OpenRead("output/通過流創(chuàng)建Excel文件.xlsx").CopyTo(stream); // 從內(nèi)存流加載 Excel 文件 workbook.LoadFromStream(stream); // 獲取工作簿中的第一個工作表 Worksheet sheet = workbook.Worksheets[0]; // 修改表頭行的樣式 CellRange headerRow = sheet.AllocatedRange.Rows[0]; headerRow.Style.Font.FontName = "黑體"; headerRow.Style.Font.Size = 12f; headerRow.Style.Color = Color.FromArgb(108, 91, 123); headerRow.Borders.Color = Color.FromArgb(255, 255, 255); // 修改數(shù)據(jù)行的樣式 for (int i = 1; i < sheet.AllocatedRange.Rows.Count(); i++) { CellRange dataRow = sheet.AllocatedRange.Rows[i]; dataRow.Style.Font.FontName = "黑體"; dataRow.Style.Font.Size = 10f; dataRow.Style.Color = Color.FromArgb(255, 204, 128); dataRow.Borders.Color = Color.FromArgb(158, 158, 158); // 更改著色(偶數(shù)行) if (i % 2 == 0) { dataRow.Style.Color = Color.FromArgb(129, 222, 227); } } // 自動調(diào)整列寬以適應(yīng)內(nèi)容 for (int k = 1; k <= sheet.AllocatedRange.Columns.Count(); k++) { sheet.AutoFitColumn(k); } // 修改邊框顏色 sheet.AllocatedRange.Style.Borders.Color = Color.White; // 將修改后的工作簿保存回內(nèi)存流 workbook.SaveToStream(stream); // 將流內(nèi)容寫入到一個新文件 File.WriteAllBytes("output/通過流修改Excel文件.xlsx", stream.ToArray()); // 釋放資源 workbook.Dispose(); } } }
結(jié)果
到此這篇關(guān)于.NET利用C#字節(jié)流動態(tài)操作Excel文件的文章就介紹到這了,更多相關(guān)C#字節(jié)流動態(tài)操作Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?TaskScheduler任務(wù)調(diào)度器的實現(xiàn)
本文主要介紹了C#?TaskScheduler任務(wù)調(diào)度器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-05-05