C#导入导出Excele数据

注:对于实体类对象最好新建一个并且继承原有实体类,这样可以将类型进行修改;

方法一:此种方法是用EPPLUS中的FileInfo流进行读取的(是不是流我还真不太了解,若有懂得请留言,非常感谢了)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using Abp.Extensions;
 7
 8 namespace HYZT.Ltxy.International.Ctrip.Exporting
 9 {
10     public class ExcelLib
11     {
12         public  ICtripPolicyExcelImport GetExcel(string filePath)
13         {
14             if (filePath.Trim() .IsNullOrEmpty())
15                 throw new Exception("文件名不能为空");
16     //因为这儿用得是EPPLUS对Excel进行的操作,所以只能操作
17     //2007以后的版本以后的(即扩展名为.xlsx)
18             if (!filePath.Trim().EndsWith("xlsx"))
19                 throw new Exception("请使用office Excel 2007版本或2010版本");
20
21             else if (filePath.Trim().EndsWith("xlsx"))
22             {
23                 ICtripPolicyExcelImport res = new CtripPolicyExcelImport(filePath.Trim());
24                 return res;
25             }
26             else return null;
27         }
28     }
29 }

方法接口:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace HYZT.Ltxy.International.Ctrip.Exporting
 8 {
 9     public interface ICtripPolicyExcelImport
10     {
11         /// <summary> 打开文件 </summary>
12         bool Open();
13         //ExcelVersion Version { get; }
14         /// <summary> 文件路径 </summary>
15         string FilePath { get; set; }
16         /// <summary> 文件是否已经打开 </summary>
17         bool IfOpen { get; }
18         /// <summary> 文件包含工作表的数量 </summary>
19         int SheetCount { get; }
20         /// <summary> 当前工作表序号 </summary>
21         int CurrentSheetIndex { get; set; }
22         /// <summary> 获取当前工作表中行数 </summary>
23         int GetRowCount();
24         /// <summary> 获取当前工作表中列数 </summary>
25         int GetColumnCount();
26         /// <summary> 获取当前工作表中某一行中单元格的数量 </summary>
27         /// <param name="Row">行序号</param>
28         int GetCellCountInRow(int Row);
29         /// <summary> 获取当前工作表中某一单元格的值(按字符串返回) </summary>
30         /// <param name="Row">行序号</param>
31         /// <param name="Col">列序号</param>
32         string GetCellValue(int Row, int Col);
33         /// <summary> 关闭文件 </summary>
34         void Close();
35     }
36 }

方法实现:

  1 using OfficeOpenXml;
  2 using System;
  3 using System.Collections.Generic;
  4 using System.IO;
  5 using System.Linq;
  6 using System.Text;
  7 using System.Threading.Tasks;
  8
  9 namespace HYZT.Ltxy.International.Ctrip.Exporting
 10 {
 11     public class CtripPolicyExcelImport:ICtripPolicyExcelImport
 12     {
 13
 14         public CtripPolicyExcelImport()
 15         { }
 16
 17         public CtripPolicyExcelImport(string path)
 18         { filePath = path; }
 19
 20
 21         private string filePath = "";
 22         private ExcelWorkbook book = null;
 23         private int sheetCount = 0;
 24         private bool ifOpen = false;
 25         private int currentSheetIndex = 0;
 26         private ExcelWorksheet currentSheet = null;
 27         private ExcelPackage ep = null;
 28
 29          public bool Open()
 30         {
 31             try
 32             {
 33                 ep = new ExcelPackage(new FileInfo(filePath));
 34
 35                 if (ep == null) return false;
 36                 book =ep.Workbook;
 37                 sheetCount = book.Worksheets.Count;
 38                 currentSheetIndex = 0;
 39                 currentSheet = book.Worksheets[1];
 40                 ifOpen = true;
 41             }
 42             catch (Exception ex)
 43             {
 44                 throw new Exception(ex.Message);
 45             }
 46             return true;
 47         }
 48
 49         public void Close()
 50         {
 51             if (!ifOpen || ep == null) return;
 52             ep.Dispose();
 53         }
 54
 55         //public ExcelVersion Version
 56         //{ get { return ExcelVersion.Excel07; } }
 57
 58         public string FilePath
 59         {
 60             get { return filePath; }
 61             set { filePath = value; }
 62         }
 63
 64         public bool IfOpen
 65         { get { return ifOpen; } }
 66
 67         public int SheetCount
 68         { get { return sheetCount; } }
 69
 70         public int CurrentSheetIndex
 71         {
 72             get  { return currentSheetIndex; }
 73             set
 74             {
 75                 if (value != currentSheetIndex)
 76                 {
 77                     if (value >= sheetCount)
 78                         throw new Exception("工作表序号超出范围");
 79                     currentSheetIndex = value;
 80                     currentSheet =book.Worksheets[currentSheetIndex+1];
 81                 }
 82             }
 83         }
 84
 85         public int GetRowCount()
 86         {
 87             if (currentSheet == null) return 0;
 88             return currentSheet.Dimension.End.Row;
 89         }
 90
 91         public int GetColumnCount()
 92         {
 93             if (currentSheet == null) return 0;
 94             return currentSheet.Dimension.End.Column;
 95         }
 96
 97         public int GetCellCountInRow(int Row)
 98         {
 99             if (currentSheet == null) return 0;
100             if (Row >= currentSheet.Dimension.End.Row) return 0;
101             return currentSheet.Dimension.End.Column;
102         }
103     //根据行号和列号获取指定单元格的数据
104         public string GetCellValue(int Row, int Col)
105         {
106             if (currentSheet == null) return "";
107             if (Row >= currentSheet.Dimension.End.Row || Col >= currentSheet.Dimension.End.Column) return "";
108             object tmpO =currentSheet.GetValue(Row+1, Col+1);
109             if (tmpO == null) return "";
110             return tmpO.ToString();
111         }
112     }
113 }
方法调用实现功能:

1 //用于程序是在本地,所以此时的路径是本地电脑的绝对路劲;
 2 //当程序发布后此路径应该是服务器上的绝对路径,所以在此之前还要有
 3 //一项功能是将本地文件上传到服务器上的指定位置,此时在获取路径即可
 4  public string GetExcelToCtripPolicy(string filePath)
 5         {
 6             ExcelLib lib = new ExcelLib();
 7             if (filePath == null)
 8                 return new ReturnResult<bool>(false, "未找到相应文件");
 9            string str= tmp.GetCellValue(i, j);
10            return str;
11         }

方法二:将Excel表格转化成DataTable表,然后在对DataTable进行业务操作

 1 using Abp.Application.Services;
 2 using OfficeOpenXml;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Data;
 6 using System.IO;
 7 using System.Linq;
 8 using System.Text;
 9 using System.Threading.Tasks;
10
11 namespace HYZT.Ltxy.International.Ctrip.GetExcelToDataTable
12 {
13     public class EPPlusHelperAppService:ApplicationService,IEPPlusHelperAppService
14     {
15         private   static string GetString(object obj)
16         {
17             try
18             {
19                 return obj.ToString();
20             }
21             catch (Exception ex)
22             {
23                 return "";
24             }
25         }
26
27         /// <summary>
28         ///将指定的Excel的文件转换成DataTable (Excel的第一个sheet)
29         /// </summary>
30         /// <param name="fullFielPath">文件的绝对路径</param>
31         /// <returns></returns>
32         public DataTable WorksheetToTable(string filePath)
33         {
34             try
35             {
36                 FileInfo existingFile = new FileInfo(filePath);
37
38                 ExcelPackage package = new ExcelPackage(existingFile);
39                 ExcelWorksheet worksheet = package.Workbook.Worksheets[1];//选定 指定页
40
41                 return WorksheetToTable(worksheet);
42             }
43             catch (Exception)
44             {
45                 throw;
46             }
47         }
48
49         /// <summary>
50         /// 将worksheet转成datatable
51         /// </summary>
52         /// <param name="worksheet">待处理的worksheet</param>
53         /// <returns>返回处理后的datatable</returns>
54         public  static  DataTable WorksheetToTable(ExcelWorksheet worksheet)
55         {
56             //获取worksheet的行数
57             int rows = worksheet.Dimension.End.Row;
58             //获取worksheet的列数
59             int cols = worksheet.Dimension.End.Column;
60
61             DataTable dt = new DataTable(worksheet.Name);
62             DataRow dr = null;
63             for (int i = 1; i <= rows; i++)
64             {
65                 if (i > 1)
66                     dr = dt.Rows.Add();
67
68                 for (int j = 1; j <= cols; j++)
69                 {
70                     //默认将第一行设置为datatable的标题
71                     if (i == 1)
72                         dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));
73                     //剩下的写入datatable
74                     else
75                         dr[j - 1] = GetString(worksheet.Cells[i, j].Value);
76                 }
77             }
78             return dt;
79         }
80     }
81 }

之前我有一个程序用的是方法一进行Excel导入的,速度不是很快,后来我又用了第二种方法但是速度更慢了,到底这两种方法哪种快,请大虾指导,还是我用第二种方法的时候业务判断有问题,不得而知,

就请明白人知道我到底这两种方法哪种比较好些;

时间: 2024-07-30 13:46:15

C#导入导出Excele数据的相关文章

Mysql导入导出大量数据的方法、备份恢复办法

经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyadmin就会很卡.甚至如果你是想导入大量数据,则phpmyadmin完全无法完成.因为phpmyadmin是基于PHP网页的,无法上传太大的sql文件.其实mysql官方给了我们很好的解决方案:mysqldump. 下面介绍,如何在Windows环境下,使用mysqldump导出数据库: 找到你mys

MySQL mysqldump 导入/导出 结构&amp;数据&amp;存储过程&amp;函数&amp;事件&amp;触发器

———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 mysqldump -d -B dbname1 dbname2 -u root -p > xxx.sql 2.①导出一个库数据 mysqldump -t dbname -u root -p > xxx.sql ②导出多个库数据 mysqldump -t -B dbname1 dbname2 -u r

5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出

 1 固定集合 固定集合值得是事先创建而且大小固定的集合 2 固定集合的特征:固定集合很像环形队列,如果空间不足,最早文档就会被删除,为新的文档腾出空间.一般来说,固定集合适用于任何想要自动淘汰过期属性的场景,没有太多的操作限制. 3 创建固定集合使用命令: db.createCollection("collectionName",{capped:true,size:100000,max:100}); size:指定集合大小,单位为KB,max指定文档的数量 当指定文档数量上限时,

Asp.net中利用NPOI组件快速导入导出Execl数据

相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生. 以前做这个功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-excel";就可以导出html数据表格到execl中,这种方法的问题就是编码格式的兼容性太差,用Mac OS之类的 office打开直接乱码给你看.或者是调用office的COM组件,或宏

phpmyadmin导入导出大数据文件的办法

在phpmyadmin的使用中,经常需要进行导入导出数据库的操作. 但是在导入导出大型数据库文件的时候经常会只是部分导出或者部分导入. 或者是导入导出不成功. 原因就是服务器和php.mysql限制了导出导入数据库文件的大小.而改相应的配置又十分繁琐,所以这里提供一个绕过导出导入有大小限制的办法. 这个思路就是直接在服务器上面进行导出导入.过程如下 将phpMyAdmin/config.sample.inc.php 文件改名为phpMyAdmin/config.inc.php并打开编辑 * Di

Oracle使用imp/exop远程导入导出dmp数据

在导入导出数据之前,习惯性的检查一下,看看我们自己的机器可不可以连接远程的Oracle主机,检测方法是tnsping SERVICE_NAME.我的机器如下: C:\Users\zx>tnsping orcl 如图:主机为:Lenovo-PC,服务名:orcl 上述操作是ping自己,下面我们ping远程主机.使用方法:tnsping IP/SERVICE_NAME,如下: C:\Users\zx>tnsping 10.120.56.203/orcl 如图:主机和服务名由下图中红框标出 远程导

Oracle sqlldr导入导出txt数据文件详解

一.sqlldr导入txt 1.预备 a).txt文件 这里要保存成无签名的UTF-8 b).oracle建表 2.编写控制文件input_test.ctl LOAD DATA CHARACTERSET 'UTF8' --字符集设定 INFILE 'd:\input_test.txt' --要导入的文本数据路径,可写多个REPLACE into TABLE input_test --清空原有数据再导入方式 追加导入 用append into table t_namefields terminat

java导入导出Excel数据的要点记录

< 客户端的B/S架构输出方式 加下划线这部分代码是B/S模式中采用的输出方式, //获得输出流,该输出流的输出介质是客户端浏览器 OutputStream output=response.getOutputStream(); response.reset(); response.setHeader("Content-disposition","attachment; filename=temp.xls"); response.setContentType(&

导入导出数据库数据,报错,链接服务器&quot;(null)&quot;的 OLE DB 访问接口 &quot;Microsoft.Jet.OLEDB.4.0&quot; 返回了消息 &quot;未指定的错误&quot;。

在操作数据库中,我们难免会遇到导入和导出数据库中的数据问题,但有时用SQL语句操作时,就会报各种错误,比如下面这种错误. 错误各种找啊,最终解决,现总结原因如下: 1.未开启Ad Hoc Distributed Queries 服务: 开启方式和关闭方式如下: 1 --启用Ad Hoc Distributed Queries: 2 exec sp_configure 'show advanced options',1 3 reconfigure 4 exec sp_configure 'Ad H