C#读写Excel学习笔记

1.C#读写Excel的几种方法

2.C#读写Excel-Microsoft.Office.Interop.Excel(前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel)

3.NPOI方法(推荐、在不安装office的时候也是可以读写的,速度很快):

  1 using NPOI.HSSF.UserModel;
  2 using NPOI.XSSF.UserModel;
  3 using System;
  4 using System.Data;
  5 using System.IO;
  6 
  7 /// <summary>
  8 /// EXCEL操作类
  9 /// </summary>
 10 public class NPOIHelper
 11 {
 12     /// <summary>
 13     /// 读取指定路径的Excel文件到DataTable
 14     /// </summary>
 15     /// <param name="filePath"></param>
 16     /// <returns></returns>
 17     public static DataTable ReadExcel(string filePath)
 18     {
 19         NPOI.SS.UserModel.ISheet sheet;
 20         if (filePath.Contains(".xlsx"))  // 2007 xlsx
 21         {
 22             #region//初始化信息
 23             XSSFWorkbook hssfworkbook;
 24             try
 25             {
 26                 using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
 27                 {
 28                     hssfworkbook = new XSSFWorkbook(file);
 29                 }
 30             }
 31             catch (Exception e)
 32             {
 33                 throw e;
 34             }
 35             sheet = hssfworkbook.GetSheetAt(0);
 36             #endregion
 37             System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
 38             DataTable dt = new DataTable();
 39             for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++)  // cell数
 40             {
 41                 dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
 42             }
 43             while (rows.MoveNext())
 44             {
 45                 XSSFRow row = (XSSFRow)rows.Current;
 46                 DataRow dr = dt.NewRow();
 47                 for (int i = 0; i < row.LastCellNum; i++)
 48                 {
 49                     NPOI.SS.UserModel.ICell cell = row.GetCell(i);
 50                     if (cell == null)
 51                     {
 52                         dr[i] = null;
 53                     }
 54                     else
 55                     {
 56                         dr[i] = cell.ToString();
 57                     }
 58                 }
 59                 dt.Rows.Add(dr);
 60             }
 61             return dt;
 62         }
 63         else  // 2003 xls
 64         {
 65             HSSFWorkbook hssfworkbook;
 66             try
 67             {
 68                 using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
 69                 {
 70                     hssfworkbook = new HSSFWorkbook(file);
 71                 }
 72             }
 73             catch (Exception e)
 74             {
 75                 throw e;
 76             }
 77             sheet = hssfworkbook.GetSheetAt(0);
 78             System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
 79             DataTable dt = new DataTable();
 80             for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++)
 81             {
 82                 dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
 83             }
 84             while (rows.MoveNext())
 85             {
 86                 HSSFRow row = (HSSFRow)rows.Current;
 87                 DataRow dr = dt.NewRow();
 88                 for (int i = 0; i < row.LastCellNum; i++)
 89                 {
 90                     NPOI.SS.UserModel.ICell cell = row.GetCell(i);
 91                     if (cell == null)
 92                     {
 93                         dr[i] = null;
 94                     }
 95                     else
 96                     {
 97                         dr[i] = cell.ToString();
 98                     }
 99                 }
100                 dt.Rows.Add(dr);
101             }
102             return dt;
103         }
104     }
105 
106     /// <summary>
107     /// 将DataTable数据写入到指定路径的Excel文件
108     /// </summary>
109     /// <param name="dt"></param>
110     /// <param name="filePath"></param>
111     public static void WriteExcel(DataTable dt, string filePath)
112     {
113         if (!string.IsNullOrEmpty(filePath) && null != dt && dt.Rows.Count > 0)
114         {
115             if (filePath.Contains(".xlsx"))  //  2007 xlsx
116             {
117                 XSSFWorkbook book = new XSSFWorkbook();
118                 NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(dt.TableName);
119 
120                 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
121                 for (int i = 0; i < dt.Columns.Count; i++)
122                 {
123                     row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
124                 }
125                 for (int i = 0; i < dt.Rows.Count; i++)
126                 {
127                     NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1);
128                     for (int j = 0; j < dt.Columns.Count; j++)
129                     {
130                         row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
131                     }
132                 }
133                 // 写入到客户端  
134                 using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
135                 {
136                     book.Write(ms);
137                     using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
138                     {
139                         byte[] data = ms.ToArray();
140                         fs.Write(data, 0, data.Length);
141                         fs.Flush();
142                     }
143                     book = null;
144                 }
145             }
146             else  // 2003 xls
147             {
148                 NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
149                 NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(dt.TableName);
150 
151                 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
152                 for (int i = 0; i < dt.Columns.Count; i++)
153                 {
154                     row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
155                 }
156                 for (int i = 0; i < dt.Rows.Count; i++)
157                 {
158                     NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1);
159                     for (int j = 0; j < dt.Columns.Count; j++)
160                     {
161                         row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
162                     }
163                 }
164                 // 写入到客户端  
165                 using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
166                 {
167                     book.Write(ms);
168                     using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
169                     {
170                         byte[] data = ms.ToArray();
171                         fs.Write(data, 0, data.Length);
172                         fs.Flush();
173                     }
174                     book = null;
175                 }
176             }
177         }
178     }
179 }

附加:C# DataTable转化为自定义DataTable

365个夜晚,我希望做到两天更一篇博客。加油,小白!
原文地址:https://www.cnblogs.com/qq2806933146xiaobai/p/14191662.html