C#使用ClosedXML進(jìn)行讀寫excel操作
項(xiàng)目簡(jiǎn)介
ClosedXML是.NET平臺(tái)上的一款開(kāi)源庫(kù),它使得程序員能夠方便地創(chuàng)建、讀取和修改Excel文件(.xlsx格式)。無(wú)需直接與Microsoft Office Interop進(jìn)行交互, ClosedXML提供了一種輕量級(jí)且高性能的方式來(lái)處理Excel數(shù)據(jù),兼容.NET Framework及.NET Core。
技術(shù)分析
易用性:ClosedXML提供了清晰、直觀的API,使得創(chuàng)建表格、設(shè)置樣式、插入公式等操作變得簡(jiǎn)單。例如,只需幾行代碼就能創(chuàng)建一個(gè)新的工作簿并填充數(shù)據(jù):
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello";
worksheet.Cell("B1").Value = "World";
workbook.SaveAs("HelloWorld.xlsx");
}
性能優(yōu)化:ClosedXML通過(guò)內(nèi)存映射文件和延遲計(jì)算策略提高了性能,這意味著直到需要時(shí)才會(huì)計(jì)算或?qū)懭霐?shù)據(jù),減少了不必要的資源消耗。
功能全面:ClosedXML支持處理復(fù)雜的Excel功能,如圖表、數(shù)據(jù)驗(yàn)證、條件格式化、超鏈接等。此外,還支持讀取和寫入數(shù)據(jù)表以及處理大型數(shù)據(jù)集。
版本兼容性:該庫(kù)已適配.NET Framework 4.0+ 和 .NET Core,確保了跨平臺(tái)的兼容性和未來(lái)發(fā)展的潛力。
社區(qū)活躍:ClosedXML有一個(gè)活躍的開(kāi)發(fā)團(tuán)隊(duì)和社區(qū),不斷修復(fù)bug、添加新功能,并對(duì)用戶反饋?zhàn)鞒龇e極回應(yīng)。
應(yīng)用場(chǎng)景
數(shù)據(jù)報(bào)表生成:快速將數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出到Excel,生成自定義模板的報(bào)表。
文件解析:用于讀取現(xiàn)有的Excel文件,提取其中的數(shù)據(jù)進(jìn)行分析或?qū)氲狡渌到y(tǒng)。
前端下載功能:配合Web應(yīng)用,允許用戶下載自定義的Excel文件。
特點(diǎn)
簡(jiǎn)潔API:使代碼更易于編寫和理解。
強(qiáng)大性能:避免了對(duì)Office Interop的依賴,提高了運(yùn)行速度和內(nèi)存效率。
完整性:覆蓋了大部分Excel的功能特性。
可擴(kuò)展性:允許自定義樣式和行為以滿足特定需求。
跨平臺(tái)支持:可以在Windows、Linux和macOS上運(yùn)行。
C#使用ClosedXML讀寫excel
首先使用NuGet安裝ClosedXML,然后在程序中添加引用ClosedXML.Excel;
1.導(dǎo)出數(shù)據(jù)到Excel
public void ExportToExcel(DataTable dt)
{
using (var workbook = new XLWorkbook())
{
if (dt.TableName == "") dt.TableName = "sheet1";
var worksheet = workbook.Worksheets.Add(dt.TableName);
var header = worksheet.FirstRow();
for (int i = 0; i < dt.Columns.Count; ++i)
{
worksheet.Cell(1, i + 1).Value = dt.Columns[i].ColumnName;
worksheet.Cell(1, i + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Cell(1, i + 1).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
}
for (int i = 0; i < dt.Rows.Count; ++i)
{
for (int j = 0; j < dt.Columns.Count; ++j)
{
worksheet.Cell(i + 2, j + 1).Value = dt.Rows[i][j].ToString();
worksheet.Cell(i + 2, j + 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
worksheet.Cell(i + 2, j + 1).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
}
}
workbook.SaveAs(sfd.FileName);
}
}2.從Excel讀取數(shù)據(jù)
public DataTable ImportExcelToDataTable(string filepath)
{
DataTable dt = new DataTable();
DataColumn dataColumn=new DataColumn("columnName1");
dt.Columns.Add(dataColumn);
dataColumn=new DataColumn("columnName2");
dt.Columns.Add(dataColumn);
dataColumn=new DataColumn("columnName3");
dt.Columns.Add(dataColumn);
dataColumn=new DataColumn("columnName4");
dt.Columns.Add(dataColumn);
using (XLWorkbook workBook = new XLWorkbook(filepath))
{
IXLWorksheet workSheet = workBook.Worksheet(1);
bool isFirstRow = true;
foreach (var row in workSheet.Rows())
{
if (isFirstRow)
{
isFirstRow = false;
continue;
}
else
{
dt.Rows.Add();
int i = 0;
foreach (IXLCell cell in row.Cells())
{
if(i>dt.Columns.Count-1)
{
break;
}
dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
i++;
}
}
}
}
return dt;
}3.讀取內(nèi)容映射到DataTable
using ClosedXML.Excel;
using DocumentFormat.OpenXml.Office2010.ExcelAc;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
public class ExcelReader
{
/// <summary>
/// 讀取 Excel 文件內(nèi)容并返回包含多個(gè)工作表的 Dictionary 列表
/// </summary>
/// <param name="excelFilePath">Excel 文件路徑</param>
/// <param name="sheetNames">需要讀取的工作表名稱列表</param>
/// <returns>工作表:工作表數(shù)據(jù)</returns>
public Dictionary<string, DataTable> ReadExcel(string excelFilePath, List<string> sheetNames)
{
Dictionary<string, DataTable> result = new Dictionary<string, DataTable>();
try
{
using (var workbook = new XLWorkbook(excelFilePath))
{
// 遍歷所有需要讀取的工作表
foreach (var sheetName in sheetNames)
{
// 判斷工作表是否存在
if (workbook.Worksheets.Contains(sheetName))
{
var worksheet = workbook.Worksheet(sheetName);
DataTable dataTable = ConvertWorksheetToDataTable(worksheet);
result.Add(sheetName, dataTable);
}
else
{
Console.WriteLine($"工作表 {sheetName} 不存在!");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"讀取 Excel 文件時(shí)發(fā)生錯(cuò)誤: {ex.Message}");
}
return result;
}
/// <summary>
/// 將工作表轉(zhuǎn)換為 DataTable
/// </summary>
/// <param name="worksheet">工作表</param>
/// <returns>轉(zhuǎn)換后的 DataTable</returns>
private DataTable ConvertWorksheetToDataTable(IXLWorksheet worksheet)
{
DataTable dataTable = new DataTable();
bool isHeaderRow = true;
// 遍歷工作表的每一行
foreach (var row in worksheet.Rows())
{
if (isHeaderRow)
{
// 第一個(gè)非空單元格是列頭
foreach (var cell in row.Cells())
{
dataTable.Columns.Add(cell.Value.ToString());
}
isHeaderRow = false;
}
else
{
// 每一行對(duì)應(yīng) DataTable 的一行
DataRow dataRow = dataTable.NewRow();
int columnIndex = 0;
foreach (var cell in row.Cells())
{
dataRow[columnIndex] = cell.Value.ToString();
columnIndex++;
}
dataTable.Rows.Add(dataRow);
}
}
return dataTable;
}
}
public class Program
{
public static void Main()
{
string excelFilePath = @"C:\Users\Mike\Desktop\Demo.xlsx";
List<string> sheetNames = new List<string> { "導(dǎo)入", "導(dǎo)入2" };
ExcelReader excelReader = new ExcelReader();
var result = excelReader.ReadExcel(excelFilePath, sheetNames);
foreach (var item in result)
{
Console.WriteLine($"工作表:{item.Key}");
var dt = item.Value;
foreach (DataRow row in dt.Rows)
{
//打印該行的第一列、第二列、第三列的內(nèi)容
Console.WriteLine($"{row[0]}_{row[1]}_{row[2]}");
}
Console.WriteLine();
}
}
}4.讀取Sheet名稱列表
class Program
{
static void Main()
{
string filePath = "C:\\Users\\XCKJ\\Desktop\\導(dǎo)入.xlsx"; // 請(qǐng)?zhí)鎿Q為你文件的路徑
var list = GetSheetNameList(filePath);// 獲取所有工作表(sheet)名稱
}
private static List<string> GetSheetNameList(string filePath)
{
// 打開(kāi) Excel 文件
using (var workbook = new XLWorkbook(filePath))
{
// 獲取所有工作表(sheet)名稱
List<string> sheetNames = new List<string>();
foreach (var worksheet in workbook.Worksheets)
{
sheetNames.Add(worksheet.Name);
}
return sheetNames;
}
}
}到此這篇關(guān)于C#使用ClosedXML進(jìn)行讀寫excel操作的文章就介紹到這了,更多相關(guān)C# ClosedXML讀寫excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET中的靜態(tài)與非靜態(tài)的區(qū)別分析
.NET中的靜態(tài)與非靜態(tài)的區(qū)別分析,需要的朋友可以參考一下2013-03-03
算法練習(xí)之從String.indexOf的模擬實(shí)現(xiàn)開(kāi)始
這篇文章主要介紹了算法練習(xí)從String.indexOf的模擬實(shí)現(xiàn)開(kāi)始,需要的朋友可以參考下2014-12-12
C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法
這篇文章主要介紹了C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法,對(duì)于C#程序界面的設(shè)計(jì)有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08
C#實(shí)體類轉(zhuǎn)換的兩種方式小結(jié)
這篇文章主要介紹了C#實(shí)體類轉(zhuǎn)換的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
C#字符串內(nèi)存分配與駐留池學(xué)習(xí)分享
這篇文章主要介紹了C#字符串內(nèi)存分配與駐留池學(xué)習(xí)分享,大家參考使用吧2013-12-12

