好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#导入导出Excel数据的两种方法

本文为大家分享了C#导入导出Excel数据的具体代码,供大家参考,具体内容如下

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

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

?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Abp.Extensions;

 

namespace HYZT.Ltxy.International.Ctrip.Exporting

{

  public class ExcelLib

  {

   public ICtripPolicyExcelImport GetExcel( string filePath)

   {

    if (filePath.Trim() .IsNullOrEmpty())

     throw new Exception( "文件名不能为空" );

  //因为这儿用得是EPPLUS对Excel进行的操作,所以只能操作

  //2007以后的版本以后的(即扩展名为.xlsx)

    if (!filePath.Trim().EndsWith( "xlsx" ))

     throw new Exception( "请使用office Excel 2007版本或2010版本" );

 

    else if (filePath.Trim().EndsWith( "xlsx" ))

    {

     ICtripPolicyExcelImport res = new CtripPolicyExcelImport(filePath.Trim());

     return res;

    }

    else return null ;

   }

  }

}

方法接口:

?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace HYZT.Ltxy.International.Ctrip.Exporting

{

  public interface ICtripPolicyExcelImport

  {

   /// <summary> 打开文件 </summary>

   bool Open();

   //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();

  }

}

方法实现:

?

using OfficeOpenXml;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace HYZT.Ltxy.International.Ctrip.Exporting

{

  public class CtripPolicyExcelImport:ICtripPolicyExcelImport

  {

 

   public CtripPolicyExcelImport()

   { }

 

   public CtripPolicyExcelImport( 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 string GetExcelToCtripPolicy( string filePath)

   {

    ExcelLib lib = new ExcelLib();

    if (filePath == null )

     return new ReturnResult< bool >( false , "未找到相应文件" );

    string str= tmp.GetCellValue(i, j);

    return str;

   }

 

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

?

using Abp.Application.Services;

using OfficeOpenXml;

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace HYZT.Ltxy.International.Ctrip.GetExcelToDataTable

{

  public class EPPlusHelperAppService:ApplicationService,IEPPlusHelperAppService

  {

   private static string GetString( object obj)

   {

    try

    {

     return obj.ToString();

    }

    catch (Exception ex)

    {

     return "" ;

    }

   }

 

   /// <summary>

   ///将指定的Excel的文件转换成DataTable (Excel的第一个sheet)

   /// </summary>

   /// <param name="fullFielPath">文件的绝对路径</param>

   /// <returns></returns>

   public DataTable WorksheetToTable( string filePath)

   {

    try

    {

     FileInfo existingFile = new FileInfo(filePath);

 

     ExcelPackage package = new ExcelPackage(existingFile);

     ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; //选定 指定页

 

     return WorksheetToTable(worksheet);

    }

    catch (Exception)

    {

     throw ;

    }

   }

 

   /// <summary>

   /// 将worksheet转成datatable

   /// </summary>

   /// <param name="worksheet">待处理的worksheet</param>

   /// <returns>返回处理后的datatable</returns>

   public static DataTable WorksheetToTable(ExcelWorksheet worksheet)

   {

    //获取worksheet的行数

    int rows = worksheet.Dimension.End.Row;

    //获取worksheet的列数

    int cols = worksheet.Dimension.End.Column;

 

    DataTable dt = new DataTable(worksheet.Name);

    DataRow dr = null ;

    for ( int i = 1; i <= rows; i++)

    {

     if (i > 1)

      dr = dt.Rows.Add();

 

     for ( int j = 1; j <= cols; j++)

     {

      //默认将第一行设置为datatable的标题

      if (i == 1)

       dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));

      //剩下的写入datatable

      else

       dr[j - 1] = GetString(worksheet.Cells[i, j].Value);

     }

    }

    return dt;

   }

  }

}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

dy("nrwz");

查看更多关于C#导入导出Excel数据的两种方法的详细内容...

  阅读:54次