C#下使用第三方开源控件读取Excel文件的内容

使用了两个开源控件读取Excel文件的内容,不需要安装Excel或Office,开发环境可能需要vs2008(2005没测试过)


NPOI,       读取xls文件(Excel2003及之前的版本)   (NPOI.dll+Ionic.Zip.dll)     http://npoi.codeplex.com/

EPPlus,    读取xlsx文件(Excel2007版本)                (EPPlus.dll)                       http://epplus.codeplex.com/


本文中只实现了Excel文件的读取,实际上,这两个控件均支持对其内容,格式,公式等进行修改,这些复杂功能尚无需求,所以没有实现


读取接口IExcel:

public interface IExcel
    {
        /// <summary> 打开文件 </summary>
        bool Open();
        /// <summary> 文件版本 </summary>
        ExcelVersion Version { get; }
        /// <summary> 文件路径 </summary>
        string FilePath { get; set; }
        /// <summary> 文件是否已经打开 </summary>
        bool IfOpen { get;  }
        /// <summary> 文件包含工作表的数量 </summary>
        int SheetCount { get; }
        /// <summary> 当前工作表序号 </summary>
        int CurrentSheetIndex { get; set; }
        /// <summary> 获取当前工作表中行数 </summary>
        int GetRowCount();
        /// <summary> 获取当前工作表中列数 </summary>
        int GetColumnCount();
        /// <summary> 获取当前工作表中某一行中单元格的数量 </summary>
        /// <param name="Row">行序号</param>
        int GetCellCountInRow(int Row);
        /// <summary> 获取当前工作表中某一单元格的值(按字符串返回) </summary>
        /// <param name="Row">行序号</param>
        /// <param name="Col">列序号</param>
        string GetCellValue(int Row, int Col);
        /// <summary> 关闭文件 </summary>
        void Close();
    }

public enum ExcelVersion
    {
        /// <summary> Excel2003之前版本 ,xls </summary>
        Excel03,
        /// <summary> Excel2007版本 ,xlsx  </summary>
        Excel07
    }

xls文件实现:

using NPOI.HSSF.UserModel;

public class Excel03:IExcel
    {
        public Excel03()
        { }

        public Excel03(string path)
        { filePath = path; }

        private FileStream file = null;
        private string filePath = "";
        private HSSFWorkbook book = null;
        private int sheetCount=0;
        private bool ifOpen = false;
        private int currentSheetIndex = 0;
        private HSSFSheet currentSheet = null;
             
        public string FilePath
        {
            get  { return filePath; }
            set { filePath = value; }
        }

        public bool Open()
        {
            try
            {
                file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                book= new HSSFWorkbook(file);

                if (book == null) return false;
                sheetCount = book.NumberOfSheets;
                currentSheetIndex = 0;
                currentSheet = (HSSFSheet)book.GetSheetAt(0);
                ifOpen = true;
            }
            catch (Exception ex)
            {
                throw new Exception("打开文件失败,详细信息:" + ex.Message);
            }
            return true;
        }

        public void  Close()
        {
            if (!ifOpen) return;
            file.Close();
        }

        public ExcelVersion Version
        { get { return ExcelVersion.Excel03; } }

        public bool IfOpen
        { get { return ifOpen; } }

        public int SheetCount
        { get { return sheetCount; } }

        public int CurrentSheetIndex
        {
            get { return currentSheetIndex; }
            set 
            {
                if (value != currentSheetIndex)
                {
                    if (value >= sheetCount)
                        throw new Exception("工作表序号超出范围");
                    currentSheetIndex = value;
                    currentSheet = (HSSFSheet)book.GetSheetAt(currentSheetIndex);
                }
            }
        }

        public int GetRowCount()
        {
            if (currentSheet == null) return 0;
            return currentSheet.LastRowNum + 1;         
        }

        public int GetColumnCount()
        {
            if (currentSheet == null) return 0;
            int colCount = 0;
            for (int i = 0; i <= currentSheet.LastRowNum; i++)
            {
                if (currentSheet.GetRow(i) != null && currentSheet.GetRow(i).LastCellNum+1 > colCount)
                    colCount = currentSheet.GetRow(i).LastCellNum + 1;
            }
            return colCount;
        }

        public int GetCellCountInRow(int Row)
        {
            if (currentSheet == null) return 0;
            if (Row > currentSheet.LastRowNum) return 0;
            if (currentSheet.GetRow(Row) == null) return 0;

            return currentSheet.GetRow(Row).LastCellNum+1;
        }

        public string GetCellValue(int Row, int Col)
        {
            if (Row > currentSheet.LastRowNum) return "";
            if (currentSheet.GetRow(Row) == null) return "";
             HSSFRow r = (HSSFRow)currentSheet.GetRow(Row);

             if (Col > r.LastCellNum) return "";
             if (r.GetCell(Col) == null) return "";
             return r.GetCell(Col).StringCellValue;            
        }
    }


xlsx文件实现:

using OfficeOpenXml;

public class Excel07:IExcel
    { 
        public Excel07()
        { }

        public Excel07(string path)
        { filePath = path; }

        private string filePath = "";
        private ExcelWorkbook book = null;
        private int sheetCount = 0;
        private bool ifOpen = false;
        private int currentSheetIndex = 0;
        private ExcelWorksheet currentSheet = null;
        private ExcelPackage ep = null;

        public bool Open()
        {
            try
            {
                ep = new ExcelPackage(new FileInfo(filePath));
                
                if (ep == null) return false;
                book =ep.Workbook;
                sheetCount = book.Worksheets.Count;
                currentSheetIndex = 0;
                currentSheet = book.Worksheets[1];
                ifOpen = true;
            }
            catch (Exception ex)
            {
                throw new Exception("打开文件失败,详细信息:" + ex.Message);
            }
            return true;
        }

        public void Close()
        {
            if (!ifOpen || ep == null) return;
            ep.Dispose();
        }

        public ExcelVersion Version
        { get { return ExcelVersion.Excel07; } }

        public string FilePath
        {
            get { return filePath; }
            set { filePath = value; }
        }

        public bool IfOpen
        { get { return ifOpen; } }

        public int SheetCount
        { get { return sheetCount; } }

        public int CurrentSheetIndex
        {
            get  { return currentSheetIndex; }
            set
            {
                if (value != currentSheetIndex)
                {
                    if (value >= sheetCount)
                        throw new Exception("工作表序号超出范围");
                    currentSheetIndex = value;
                    currentSheet =book.Worksheets[currentSheetIndex+1];
                }
            }
        }

        public int GetRowCount()
        {
            if (currentSheet == null) return 0;
            return currentSheet.Dimension.End.Row;
        }

        public int GetColumnCount()
        {
            if (currentSheet == null) return 0;
            return currentSheet.Dimension.End.Column;
        }

        public int GetCellCountInRow(int Row)
        {
            if (currentSheet == null) return 0;
            if (Row >= currentSheet.Dimension.End.Row) return 0;
            return currentSheet.Dimension.End.Column;
        }

        public string GetCellValue(int Row, int Col)
        {
            if (currentSheet == null) return "";
            if (Row >= currentSheet.Dimension.End.Row || Col >= currentSheet.Dimension.End.Column) return "";
            object tmpO =currentSheet.GetValue(Row + 1, Col + 1);
            if (tmpO == null) return "";
            return tmpO.ToString();
        }        
    }


调用类:

 public class ExcelLib
    {
        /// <summary> 获取Excel对象 </summary>
        /// <param name="filePath">Excel文件路径</param>
        /// <returns></returns>
        public static IExcel GetExcel(string filePath)
        {
            if (filePath.Trim() == "") 
                throw new Exception("文件名不能为空");

            if(!filePath.Trim().EndsWith("xls") && !filePath.Trim().EndsWith("xlsx"))
                throw new Exception("不支持该文件类型");

            if (filePath.Trim().EndsWith("xls"))
            {
                IExcel res = new Excel03(filePath.Trim());
                return res;
            }
            else if (filePath.Trim().EndsWith("xlsx"))
            {
                IExcel res = new Excel07(filePath.Trim());
                return res;
            }
            else return null;
        }
    }

程序中调用:

ExcelLib.IExcel tmp = ExcelLib.ExcelLib.GetExcel(Application.StartupPath + "\\TestUnicodeChars.xls");
//ExcelLib.IExcel tmp = ExcelLib.ExcelLib.GetExcel(Application.StartupPath + "\\TestUnicodeChars.xlsx");

if (tmp == null) MessageBox.Show("打开文件错误"); 
try 
{ 
	if (!tmp.Open()) 
	MessageBox.Show("打开文件错误");

 	tmp.CurrentSheetIndex = 1; 
	int asdf = tmp.GetColumnCount(); 
	string sdf = tmp.GetCellValue(0,1); 
	tmp.Close(); 
} 
catch (Exception ex) 
{ MessageBox.Show(ex.Message); return ; }



  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以使用 NPOI 库来读取 Excel 文件,它是一个开源的 .NET 库,可以在不使用 Microsoft Office 的情况下读取和写入 Excel 文件使用 NPOI 库读取 Excel 工作簿的基本流程如下: 1. 使用 NPOI 的 `FileStream` 类打开 Excel 文件。 2. 使用 NPOI 的 `HSSFWorkbook` 或 `XSSFWorkbook` 类读取 Excel 文件。 3. 通过工作簿实例可以读取到所有的工作表(Sheet) 4. 使用工作表实例可以读取工作的数据 NPOI需要下载安装 如果要给项目安装依赖可以在包管理器控制台输入 ``` PM> Install-Package NPOI ``` 之后就可以直接使用 代码示例: ```c# using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new HSSFWorkbook(file); ISheet sheet = workbook.GetSheetAt(0); IRow row = sheet.GetRow(0); ICell cell = row.GetCell(0); string value = cell.ToString(); } ``` 这个例子是读取一个Excel的第一个工作表的第一个单元格的内容。 ### 回答2: WinForm是一种用于开发Windows桌面应用程序的GUI框架,通常用于创建用户友好的界面。在使用WinForm读取Excel工作簿时,我们有多种方法可以实现,其一种是不使用Microsoft.Office.Interop.Excel库。 可以使用第三方库,例如NPOI,来读取Excel工作簿。NPOI是一个开源的.NET库,用于创建和处理Office文档,包括Excel。以下是使用NPOI来读取Excel工作簿的步骤: 1. 首先,我们需要下载并引用NPOI库。可以在NPOI的官方网站(https://github.com/nissl-lab/npoi)上找到最新版本的库。 2. 创建一个WinForm应用程序并添加一个按钮控件。 3. 在按钮的Click事件处理程序,编写代码来读取Excel工作簿。 ```csharp private void btnRead_Click(object sender, EventArgs e) { string filePath = "path_to_excel_file"; // Excel文件路径 using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook; workbook = new XSSFWorkbook(fileStream); // 使用XSSFWorkbook读取xlsx文件,如果是xls文件,则使用HSSFWorkbook ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表 for (int row = 0; row <= sheet.LastRowNum; row++) { IRow excelRow = sheet.GetRow(row); if (excelRow != null) { for (int column = 0; column < excelRow.LastCellNum; column++) { ICell cell = excelRow.GetCell(column); string cellValue = cell?.ToString(); // 读取单元格的值 // 处理单元格的值 } } } } } ``` 在这个示例,我们使用NPOI的XSSFWorkbook类来读取xlsx文件。如果要读取xls文件,则需要使用HSSFWorkbook类。使用workbook.GetSheetAt(0)方法获取第一个工作表,然后使用循环遍历每一行和每个单元格,读取单元格的值并进行处理。 使用NPOI库可以方便地读取Excel工作簿,而不需要使用Microsoft.Office.Interop.Excel库。它是一个功能强大且灵活的工具,适用于WinForm应用程序。 ### 回答3: WinForms是使用C#编写的桌面应用程序开发框架,如果我们不使用Microsoft.Office.Interop.Excel库来读取Excel工作簿,我们可以使用第三方库来完成相同的任务。 一个常用的第三方库是EPPlus,它是一个开源的.NET库,提供了许多用于读写和操作Excel文件的功能。 首先,我们需要在我们的WinForms项目引入EPPlus库。我们可以通过NuGet包管理器来安装EPPlus。 以下是一个示例代码,演示如何使用EPPlus库来读取一个Excel工作簿: ```csharp using OfficeOpenXml; // ... private void ReadExcel() { // Excel文件的路径 string filePath = "路径\\文件名.xlsx"; // 创建一个ExcelPackage对象,用于打开Excel文件 using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath))) { // 获取第一个工作ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; // 获取工作表的行数和列数 int rowCount = worksheet.Dimension.Rows; int colCount = worksheet.Dimension.Columns; // 遍历工作表的每一行 for (int row = 1; row <= rowCount; row++) { // 遍历每一列 for (int col = 1; col <= colCount; col++) { // 读取单元格的值 string cellValue = worksheet.Cells[row, col].Value?.ToString(); // 将值输出到控制台 Console.WriteLine("单元格({0},{1}): {2}", row, col, cellValue); } } } } ``` 在上面的代码,我们首先指定要打开的Excel文件路径,然后使用ExcelPackage类创建一个ExcelPackage对象。通过该对象,我们可以打开Excel文件,获取工作表,并遍历每个单元格以读取其值。 需要注意的是,EPPlus库还提供了许多其他功能,如写入Excel文件使用表格样式、添加图表等。我们可以根据需要在代码使用这些功能来进一步操作Excel文件。 总而言之,通过使用第三方库EPPlus,我们可以在不使用Microsoft.Office.Interop.Excel库的情况下,实现在WinForms应用程序读取Excel工作簿的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值