Explication détaillée de deux méthodes d'importation et d'exportation de données Excel en C#

黄舟
Libérer: 2017-03-22 11:15:02
original
3020 Les gens l'ont consulté

Cet article présente principalement en détail les deux méthodes d'importation et d'exportation C# de données Excel. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

cet article avec lequel j'ai partagé. vous le code spécifique pour C# pour importer et exporter des données Excel pour votre référence. Le contenu spécifique est le suivant

Remarque : Il est préférable de créer un nouvel objet de classe d'entité et d'hériter de la classe d'entité d'origine, afin que le le type peut être modifié ;

Méthode 1 : Cette méthode consiste à utiliser le flux FileInfo dans EPPLUS pour lire (je ne sais vraiment pas si c'est un flux, si vous savez, veuillez laisser un message, très merci)

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;
  }
 }
}
Copier après la connexion

Interface de méthode :

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(); 
 }
}
Copier après la connexion

Implémentation de la méthode :

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(); 
  }   
 }   
}
Copier après la connexion

Fonction d'implémentation de l'appel de méthode :

//用于程序是在本地,所以此时的路径是本地电脑的绝对路劲;
//当程序发布后此路径应该是服务器上的绝对路径,所以在此之前还要有
//一项功能是将本地文件上传到服务器上的指定位置,此时在获取路径即可
 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;
  }
Copier après la connexion

Méthode 2 : Convertir le tableau Excel en tableau DataTable, puis effectuer des opérations commerciales sur le 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;
  }
 }
}
Copier après la connexion

Avant, j'avais un programme qui utilisait la méthode 1 pour importer Excel, mais la vitesse n'était pas. Bientôt, j'ai utilisé la deuxième méthode mais la vitesse était encore plus lente. Laquelle des deux méthodes est la plus rapide. Ou y a-t-il un problème avec mon jugement commercial lorsque j'ai utilisé la méthode ? deuxième méthode ? Je ne sais pas. S'il vous plaît, demandez à quelqu'un qui sait laquelle de ces deux méthodes est la meilleure.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!