请选择 进入手机版 | 继续访问电脑版

我爱科技论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 447|回复: 0

[技术分享] 【C#进阶】C#实现Excel文件读取的工具类封装

[复制链接]

696

主题

743

帖子

7934

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7934

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2018-4-14 21:08:39 | 显示全部楼层 |阅读模式
Excel文件读取类:
  1. using Microsoft.Office.Interop.Excel;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;

  7. namespace ReadInfoFromDEM
  8. {
  9.     class ExcelFileReader
  10.     {
  11.         private string m_strFileName = null;

  12.         private Application m_application = null;

  13.         private Workbook m_workBook = null;

  14.         private int m_totalSheets = 0;

  15.         private int m_activeSheet = 0;

  16.         private int m_sheetColumns = 0;

  17.         private int m_sheetRows = 0;

  18.         public ExcelFileReader(string fileName)

  19.         {

  20.             m_strFileName = fileName;

  21.         }

  22.         public string FileName

  23.         {

  24.             get { return this.m_strFileName; }

  25.             set { this.m_strFileName = value; }

  26.         }

  27.         public int TotalSheets

  28.         {

  29.             get { return this.m_totalSheets; }

  30.         }

  31.         public int ActiveSheetIndex

  32.         {

  33.             get { return this.m_activeSheet; }

  34.         }

  35.         public int SheetColumns

  36.         {

  37.             get { return this.m_sheetColumns; }

  38.         }

  39.         public int SheetRows

  40.         {

  41.             get { return this.m_sheetRows; }

  42.         }

  43.         public void ActiveExcelApplication()

  44.         {

  45.             this.m_application = new Application();

  46.             try



  47.             {

  48.                 this.m_workBook = m_application.Workbooks.Open(this.m_strFileName,

  49.                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  50.                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  51.                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  52.                 Type.Missing, Type.Missing);

  53.                 this.m_totalSheets = this.m_workBook.Sheets.Count;

  54.             }

  55.             catch



  56.             {

  57.             }

  58.         }

  59.         public void ScanExcelSheetSizeByIndex(int sheetIndex)

  60.         {

  61.             Worksheet sheet = (Worksheet)m_workBook.Sheets[sheetIndex];

  62.             Range excelRange = sheet.UsedRange;

  63.             this.m_sheetColumns = excelRange.Columns.Count;

  64.             this.m_sheetRows = excelRange.Rows.Count;

  65.             this.m_activeSheet = sheetIndex;

  66.         }

  67.         public void ScanExcelSheetSizeByName(string strName)

  68.         {

  69.             for (int sheetNumber = 1; sheetNumber < m_totalSheets + 1; sheetNumber++)

  70.             {

  71.                 Worksheet sheet = (Worksheet)m_workBook.Sheets[sheetNumber];

  72.                 if (sheet.Name.ToLower().Equals(strName.ToLower()))

  73.                 {

  74.                     this.m_activeSheet = sheetNumber;

  75.                     Range excelRange = sheet.UsedRange;

  76.                     this.m_sheetColumns = excelRange.Columns.Count;

  77.                     this.m_sheetRows = excelRange.Rows.Count;

  78.                 }

  79.             }

  80.         }

  81.         public String GetCellValue(int row, int column)
  82.         {

  83.             Worksheet sheet = (Worksheet)m_workBook.Sheets[this.m_activeSheet];
  84.             // double类型转换为String 类型
  85.             String cellInfo = ((Microsoft.Office.Interop.Excel.Range)sheet.Cells[row, column]).Value + "";

  86.             return cellInfo;
  87.         }



  88.         public void DeactiveExcelApplication()
  89.         {

  90.             try



  91.             {

  92.                 this.m_workBook.Close(false, this.m_strFileName, null);

  93.                 Marshal.ReleaseComObject(this.m_workBook);

  94.             }

  95.             catch



  96.             {

  97.             }

  98.         }
  99.     }
  100. }
复制代码
Excel文件写入类:
  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.UserModel;
  3. using NPOI.XSSF.UserModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Windows.Forms;

  11. namespace ReadInfoFromDEM
  12. {
  13.     class ExcelFileWriter
  14.     {
  15.         public static Boolean SavetoExcel(DataTable data, string outputPath, bool isColumnWritten, string sheetName = "统计结果")
  16.         {
  17.             //sheetName = "统计结果";
  18.             IWorkbook workbook = null;
  19.             FileStream fs = null;
  20.             try
  21.             {
  22.                 int i = 0;
  23.                 int j = 0;
  24.                 int count = 0;
  25.                 ISheet sheet = null;

  26.                 fs = new FileStream(outputPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  27.                 if (outputPath.IndexOf(".xlsx") > 0) // 2007版本
  28.                     workbook = new XSSFWorkbook();
  29.                 else if (outputPath.IndexOf(".xls") > 0) // 2003版本
  30.                     workbook = new HSSFWorkbook();

  31.                 if (workbook != null)
  32.                 {
  33.                     sheet = workbook.GetSheet(sheetName);//获取工作表
  34.                 }
  35.                 else
  36.                 {
  37.                     //callback.PrintErrorMessage("\n新建工作表失败!");
  38.                     return false;
  39.                 }

  40.                 //创建列名
  41.                 if (sheet == null)//如果表单为空,则为datatable初始化列名
  42.                 {
  43.                     workbook.CreateSheet(sheetName);
  44.                     sheet = workbook.GetSheet(sheetName);
  45.                     if (sheet == null)
  46.                     {
  47.                         //callback.PrintErrorMessage("\n创建Excel表单" + foldername + "出错!");
  48.                         MessageBox.Show("\n创建Excel表单" + sheetName + "出错!", "提示");
  49.                         return false;
  50.                     }
  51.                 }

  52.                 if (isColumnWritten == true) //写入DataTable的列名
  53.                 {
  54.                     IRow row = sheet.CreateRow(0);
  55.                     for (j = 0; j < data.Columns.Count; ++j)
  56.                     {
  57.                         row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
  58.                     }
  59.                     count = 1;
  60.                 }
  61.                 else
  62.                 {
  63.                     count = 0;
  64.                 }

  65.                 for (i = 0; i < data.Rows.Count; ++i)
  66.                 {
  67.                     IRow row = sheet.CreateRow(count);
  68.                     for (j = 0; j < data.Columns.Count; ++j)
  69.                     {
  70.                         row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
  71.                     }
  72.                     ++count;
  73.                 }
  74.                 workbook.Write(fs); //写入到excel
  75.                 workbook = null;
  76.                 fs.Close();
  77.                 return true;

  78.             }
  79.             catch (Exception ex)
  80.             {
  81.                 //callback.PrintErrorMessage("\n" + ex.ToString());
  82.                 return false;
  83.             }
  84.             return true;
  85.         }


  86.         //添加新的sheet
  87.         public static Boolean SavetoExcelAddNewSheet(DataTable data, string outputPath, bool isColumnWritten,  string sheetName = "统计结果")
  88.         {
  89.             //sheetName = "统计结果";
  90.             IWorkbook workbook = null;
  91.             FileStream fs = null;
  92.             try
  93.             {
  94.                 int i = 0;
  95.                 int j = 0;
  96.                 int count = 0;
  97.                 ISheet sheet = null;
  98.                 ////创建文件
  99.                 if (!File.Exists(outputPath))
  100.                 {
  101.                     HSSFWorkbook hssfworkbook = new HSSFWorkbook();
  102.                     //保存  
  103.                     FileStream file = new FileStream(outputPath, FileMode.Create);
  104.                     hssfworkbook.Write(file);
  105.                     file.Close();
  106.                 }
  107.                 fs = new FileStream(outputPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  108.                 if (outputPath.IndexOf(".xlsx") > 0) // 2007版本
  109.                     workbook = new XSSFWorkbook(fs);
  110.                 else if (outputPath.IndexOf(".xls") > 0) // 2003版本
  111.                     workbook = new HSSFWorkbook(fs);

  112.                 if (workbook != null)
  113.                 {
  114.                     sheet = workbook.GetSheet(sheetName);//获取工作表
  115.                     if (sheet != null)
  116.                     {
  117.                         //callback.PrintErrorMessage("\n已存在工作表" + sheetName + ",请检查统计文件!");
  118.                         return false;
  119.                     }
  120.                 }
  121.                 else
  122.                 {
  123.                     //callback.PrintErrorMessage("\n新建工作表失败!");
  124.                     return false;
  125.                 }

  126.                 //创建列名
  127.                 if (sheet == null)//如果表单为空,则为datatable初始化列名
  128.                 {
  129.                     workbook.CreateSheet(sheetName);
  130.                     sheet = workbook.GetSheet(sheetName);
  131.                     if (sheet == null)
  132.                     {
  133.                         //callback.PrintErrorMessage("\n创建Excel表单" + foldername + "出错!");
  134.                         MessageBox.Show("\n创建Excel表单" + sheetName + "出错!", "提示");
  135.                         return false;
  136.                     }
  137.                 }

  138.                 if (isColumnWritten == true) //写入DataTable的列名
  139.                 {
  140.                     IRow row = sheet.CreateRow(0);
  141.                     for (j = 0; j < data.Columns.Count; ++j)
  142.                     {
  143.                         row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
  144.                     }
  145.                     count = 1;
  146.                 }
  147.                 else
  148.                 {
  149.                     count = 0;
  150.                 }

  151.                 for (i = 0; i < data.Rows.Count; ++i)
  152.                 {
  153.                     IRow row = sheet.CreateRow(count);
  154.                     for (j = 0; j < data.Columns.Count; ++j)
  155.                     {
  156.                         row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
  157.                     }
  158.                     ++count;
  159.                 }

  160.                 //workbook.Write(fs); //写入到excel
  161.                 //workbook = null;
  162.                 //fs.Close();

  163.                 FileStream fout = new FileStream(outputPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//写入流
  164.                 fout.Flush();
  165.                 workbook.Write(fout);//写入文件
  166.                 workbook = null;
  167.                 fout.Close();

  168.                 return true;

  169.             }
  170.             catch (Exception ex)
  171.             {
  172.                 //callback.PrintErrorMessage("\n" + ex.ToString());
  173.                 return false;
  174.             }
  175.             return true;
  176.         }
  177.     }
  178. }
复制代码
附加写入数据类:
  1. private void writeDataToExcel()
  2.         {
  3.             // 开始写入数据到Excel中去
  4.             int row = dataGridView.Rows.Count;
  5.             int col = dataGridView.ColumnCount;
  6.             // 定义一个二维数组9 * 9
  7.             wArray = new string[row, col];
  8.             for (int i = 0; i < row; i++)
  9.             {
  10.                 for (int j = 0; j < col; j++)
  11.                 {
  12.                     // 先读取行数据, 再读取列数据
  13.                     wArray[i, j] = dataGridView.Rows[i].Cells[j].Value.ToString();
  14.                 }
  15.             }

  16.             Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
  17.             if (xlApp == null)
  18.             {
  19.                 MessageBox.Show("无法创建Excel对象,您的电脑可能未安装Excel");
  20.                 return;
  21.             }

  22.             Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
  23.             Microsoft.Office.Interop.Excel.Workbook workbook =
  24.                         workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
  25.             Microsoft.Office.Interop.Excel.Worksheet worksheet =
  26.                         (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1

  27.             //写入标题            
  28.             /*for (int i = 0; i < dataGridView1.ColumnCount; i++)
  29.             {
  30.                 worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
  31.             }*/



  32.             //写入数值
  33.             for (int i = 0; i < row; i++)
  34.             {
  35.                 for (int j = 0; j < col; j++)
  36.                 {
  37.                     // 注意worksheet是从1开始的
  38.                     worksheet.Cells[i + 1, j + 1] = wArray[i, j];
  39.                 }
  40.             }

  41.             worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
  42.             try
  43.             {
  44.                 workbook.Saved = true;
  45.                 workbook.SaveCopyAs(inputFilePath);  //fileSaved = true;   
  46.                 MessageBox.Show("数据已经成功被写入到Excel文件,保存路径为:"+inputFilePath);
  47.             }
  48.             catch (Exception ex)
  49.             {               
  50.                 MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
  51.             }

  52.             xlApp.Quit();
  53.             // 强行销毁
  54.             GC.Collect();
  55.         }
复制代码







上一篇:[黑科技]Window程序窗口跑到屏幕外边去了怎么办?两个按键快速恢复!
下一篇:【C#进阶】如何实现一个C#中的Windows Form窗体不能拖动(鼠标不能移动)
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信扫一扫

快速回复 返回顶部 返回列表