C\#Excel 가 져 오기,내 보 내기

본 편 은 주로 C\#의 엑셀 가 져 오기,내 보 내기 등 을 소개 하 며,여러분 께 서 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
소개
1.1 제3자 라 이브 러 리:NPOI
설명:NPOI 는 POI 프로젝트 의.NET 버 전 으로 Excel,Word 의 읽 기와 쓰기 에 사용 할 수 있 습 니 다.
장점:Office 환경 을 설치 하지 않 아 도 된다.
다운로드 주소:http://npoi.codeplex.com/releases 
1.2 엑셀 구조 소개
워 크 북(Workbook):모든 Excel 파일 은 워 크 북 으로 이해 할 수 있 습 니 다.
시트(Sheet):하나의 워 크 북(Workbook)은 여러 개의 워 크 시트 를 포함 할 수 있 습 니 다.
줄(row):하나의 워 크 시트(Sheet)는 여러 줄 을 포함 할 수 있 습 니 다.

엑셀 가 져 오기
2.1 운영 절차

2.2 NPOI 조작 코드
설명:Excel 파일 을 List로 변환 합 니 다.
단계:
① Excel 파일 을 읽 고 워 크 북(Workbook)을 초기 화 합 니 다.
② 워 크 북 에서 워 크 시트(Sheet)를 가 져 옵 니 다.기본적으로 워 크 시트 의 첫 번 째 워 크 시트 입 니 다.
③ 워 크 시트 의 모든 줄 을 옮 겨 다 니 기(row);기본 값 은 두 번 째 줄 부터 옮 겨 다 니 며 첫 번 째 줄(번호 0)은 셀 머리 입 니 다.
④ 줄 을 옮 겨 다 니 는 모든 셀(cell)은 일정한 규칙 에 따라 대상 에 게 부여 하 는 속성 입 니 다.
코드:

/// <summary>
///  Excel2003       List   
/// </summary>
/// <param name="cellHeard">    Key Value:{ { "UserName", "  " }, { "Age", "  " } };</param>
/// <param name="filePath">        </param>
/// <param name="errorMsg">    </param>
/// <returns>    List    </returns>
private static List<T> Excel2003ToEntityList<T>(Dictionary<string, string> cellHeard, string filePath, out StringBuilder errorMsg) where T : new()
{
 errorMsg = new StringBuilder(); //     ,Excel        ,         
 List<T> enlist = new List<T>(); //       
 List<string> keys = cellHeard.Keys.ToList(); //             
 try
 {
 using (FileStream fs = File.OpenRead(filePath))
 {
  HSSFWorkbook workbook = new HSSFWorkbook(fs);
  HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); //         Sheet 
  for (int i = 1; i <= sheet.LastRowNum; i++) //  1  , 0     
  {
  // 1.         ,               ,  Excel    
  if (sheet.GetRow(i) == null)
  {
   break;
  }
 
  T en = new T();
  string errStr = ""; //       ,       ,   : 1       :XXX ;
  for (int j = 0; j < keys.Count; j++)
  {
   // 2.         '.',          ,        ,eg:UserEn.TrueName
   if (keys[j].IndexOf(".") >= 0)
   {
   // 2.1      
   string[] properotyArray = keys[j].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
   string subClassName = properotyArray[0]; // '.'         
   string subClassProperotyName = properotyArray[1]; // '.'           
   System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); //        
   if (subClassInfo != null)
   {
    // 2.1.1        
    var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null);
    // 2.1.2                 
    System.Reflection.PropertyInfo properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName);
    if (properotyInfo != null)
    {
    try
    {
     // Excel              ,     ,      
     properotyInfo.SetValue(subClassEn, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null);
    }
    catch (Exception e)
    {
     if (errStr.Length == 0)
     {
     errStr = " " + i + "       :";
     }
     errStr += cellHeard[keys[j]] + " ;";
    }
     
    }
   }
   }
   else
   {
   // 3.        
   System.Reflection.PropertyInfo properotyInfo = en.GetType().GetProperty(keys[j]);
   if (properotyInfo != null)
   {
    try
    {
    // Excel              ,     ,      
    properotyInfo.SetValue(en, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null);
    }
    catch (Exception e)
    {
    if (errStr.Length == 0)
    {
     errStr = " " + i + "       :";
    }
    errStr += cellHeard[keys[j]] + " ;";
    }
   }
   }
  }
  //       ,         
  if (errStr.Length > 0)
  {
   errorMsg.AppendLine(errStr);
  }
  enlist.Add(en);
  }
 }
 return enlist;
 }
 catch (Exception ex)
 {
 throw ex;
 }
}
 

2.3 C\#논리 조작 코드
설명:Excel 변환 후의 List에 대해 후속 작업 을 진행 합 니 다.예 를 들 어 유효성 검사,지구 화 저장 등
단계:
① 2.2 코드 를 호출 하여 Excel 파일 을 List로 변환 합 니 다.
② List에 대해 유효성 검 사 를 실시 합 니 다.필수 항목 이 비어 있 는 지,중복 기록 이 있 는 지 등 입 니 다.
③ List를 영구적 으로 저장 합 니 다.데이터베이스 에 저장 합 니 다.
④ 작업 결 과 를 되 돌려 준다.
코드:

public void ImportExcel(HttpContext context)
{
 StringBuilder errorMsg = new StringBuilder(); //     
 try
 {
 
 #region 1.  Excel        List  
 
 // 1.1  Excel        
 HttpPostedFile filePost = context.Request.Files["filed"]; //        
 string filePath = ExcelHelper.SaveExcelFile(filePost); //            
 
 //      
 // key:        ,        
 // value:         
 Dictionary<string, string> cellheader = new Dictionary<string, string> {
  { "Name", "  " },
  { "Age", "  " },
  { "GenderName", "  " },
  { "TranscriptsEn.ChineseScores", "    " },
  { "TranscriptsEn.MathScores", "    " },
 };
 
 // 1.2    ,     List   
 List<UserEntity> enlist = ExcelHelper.ExcelToEntityList<UserEntity>(cellheader, filePath, out errorMsg);
 
 #endregion
 
 #region 2. List         
 
 #region 2.1         
 
 for (int i = 0; i < enlist.Count; i++)
 {
  UserEntity en = enlist[i];
  string errorMsgStr = " " + (i + 1) + "       :";
  bool isHaveNoInputValue = false; //         
  if (string.IsNullOrEmpty(en.Name))
  {
  errorMsgStr += "       ;";
  isHaveNoInputValue = true;
  }
  if (isHaveNoInputValue) //         
  {
  en.IsExcelVaildateOK = false;
  errorMsg.AppendLine(errorMsgStr);
  }
 }
 
 #endregion
 
 #region 2.2  Excel        
 
 for (int i = 0; i < enlist.Count; i++)
 {
  UserEntity enA = enlist[i];
  if (enA.IsExcelVaildateOK == false) //        ,       
  {
  continue;
  }
 
  for (int j = i + 1; j < enlist.Count; j++)
  {
  UserEntity enB = enlist[j];
  //            
  if (enA.Name == enB.Name)
  {
   enA.IsExcelVaildateOK = false;
   enB.IsExcelVaildateOK = false;
   errorMsg.AppendLine(" " + (i + 1) + "   " + (j + 1) + "        ");
  }
  }
 }
 
 #endregion
 
 // TODO:    
 
 #endregion
 
 // 3.TODO: List         。 :      
  
 // 4.      
 bool isSuccess = false;
 if (errorMsg.Length == 0)
 {
  isSuccess = true; //          ,       
 }
 var rs = new { success = isSuccess, msg = errorMsg.ToString(), data = enlist };
 System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
 context.Response.ContentType = "text/plain";
 context.Response.Write(js.Serialize(rs)); //   Json     
 }
 catch (Exception ex)
 {
     throw ex;
 }
}
  

3.Excel 내 보 내기
3.1 내 보 내기 프로 세 스

3.2 NPOI 조작 코드
설명:List를 Excel 로 변환
단계:
① 워 크 북 만 들 기(Workbook);
② 워 크 북 에 워 크 시트(Sheet)를 만 듭 니 다.
③ 워 크 시트 에 첫 번 째 줄(row)을 만 들 고 첫 번 째 행동 열 머리 는 cellHeard 의 값 을 순서대로 기록 합 니 다(열 이름 으로).
④ List집합 을 반복 해서 반복 해서 줄(row)을 만 든 다음 cellHeard 키(속성 이름)에 따라 List의 실체 대상 에서 값 을 추출 하여 셀 에 저장 합 니 다.
코드:

/// <summary>
///         Excle2003
/// </summary>
/// <param name="cellHeard">    Key Value:{ { "UserName", "  " }, { "Age", "  " } };</param>
/// <param name="enList">   </param>
/// <param name="sheetName">     </param>
/// <returns>       </returns>
public static string EntityListToExcel2003(Dictionary<string, string> cellHeard, IList enList, string sheetName)
{
 try
 {
 string fileName = sheetName + "-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls"; //     
 string urlPath = "UpFiles/ExcelFiles/" + fileName; //      URL  ,      
 string filePath = HttpContext.Current.Server.MapPath("\\" + urlPath); //     
 
 // 1.         ,           
 string directoryName = Path.GetDirectoryName(filePath);
 if (!Directory.Exists(directoryName))
 {
  Directory.CreateDirectory(directoryName);
 }
 
 // 2.       ,          
 HSSFWorkbook workbook = new HSSFWorkbook(); //    
 ISheet sheet = workbook.CreateSheet(sheetName); //    
 IRow row = sheet.CreateRow(0);
 List<string> keys = cellHeard.Keys.ToList();
 for (int i = 0; i < keys.Count; i++)
 {
  row.CreateCell(i).SetCellValue(cellHeard[keys[i]]); //    Key  
 }
 
 // 3.List       Excel     
 int rowIndex = 1; //         (          )
 foreach (var en in enList)
 {
  IRow rowTmp = sheet.CreateRow(rowIndex);
  for (int i = 0; i < keys.Count; i++) //          ,          
  {
  string cellValue = ""; //      
  object properotyValue = null; //     
  System.Reflection.PropertyInfo properotyInfo = null; //      
 
  // 3.1          '.',          ,        ,eg:UserEn.UserName
  if (keys[i].IndexOf(".") >= 0)
  {
   // 3.1.1       (     1   ,       )
   string[] properotyArray = keys[i].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
   string subClassName = properotyArray[0]; // '.'         
   string subClassProperotyName = properotyArray[1]; // '.'           
   System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); //        
   if (subClassInfo != null)
   {
   // 3.1.2        
   var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null);
   // 3.1.3                 
   properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName);
   if (properotyInfo != null)
   {
    properotyValue = properotyInfo.GetValue(subClassEn, null); //         
   }
   }
  }
  else
  {
   // 3.2         ,                 
   properotyInfo = en.GetType().GetProperty(keys[i]);
   if (properotyInfo != null)
   {
   properotyValue = properotyInfo.GetValue(en, null);
   }
  }
 
  // 3.3               
  if (properotyValue != null)
  {
   cellValue = properotyValue.ToString();
   // 3.3.1           
   if (cellValue.Trim() == "0001/1/1 0:00:00" || cellValue.Trim() == "0001/1/1 23:59:59")
   {
   cellValue = "";
   }
  }
 
  // 3.4    Excel     
  rowTmp.CreateCell(i).SetCellValue(cellValue);
  }
  rowIndex++;
 }
 
 // 4.    
 FileStream file = new FileStream(filePath, FileMode.Create);
 workbook.Write(file);
 file.Close();
 
 // 5.      
 return urlPath;
 }
 catch (Exception ex)
 {
 throw ex;
 }
}
 

3.3 C\#논리 조작 코드
설명:Excel 변환 후의 List에 대해 후속 작업 을 진행 합 니 다.예 를 들 어 유효성 검사,지구 화 저장 등
단계:
① List집합 가 져 오기.
② 3.2 를 호출 하여 List를 Excel 파일 로 변환 합 니 다.
③ 서버 가 엑셀 파일 을 저장 하고 다운로드 링크 를 되 돌려 줍 니 다.
코드:

public void ExportExcel(HttpContext context)
{
 try
 {
 // 1.      
 List<UserEntity> enlist = new List<UserEntity>() {
  new UserEntity{Name="  ",Age=22,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=80,MathScores=90}},
  new UserEntity{Name="  ",Age=23,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=81,MathScores=91} },
  new UserEntity{Name="  ",Age=24,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=82,MathScores=92} },
  new UserEntity{Name="  ",Age=25,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=83,MathScores=93} },
  new UserEntity{Name="  ",Age=26,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=84,MathScores=94} },
 };
 
 // 2.       
 // key:        ,        
 // value:Excel    
 Dictionary<string, string> cellheader = new Dictionary<string, string> {
  { "Name", "  " },
  { "Age", "  " },
  { "GenderName", "  " },
  { "TranscriptsEn.ChineseScores", "    " },
  { "TranscriptsEn.MathScores", "    " },
 };
 
 // 3.  Excel    ,            
 string urlPath = ExcelHelper.EntityListToExcel2003(cellheader, enlist, "    ");
 System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
 context.Response.ContentType = "text/plain";
 context.Response.Write(js.Serialize(urlPath)); //   Json     
 }
 catch (Exception ex)
 {
 throw ex;
 }
}
 
3.4 코드 분석
핵심 코드 는 주로 cellheader 와 List간 의 매 핑 관계 입 니 다.

소스 코드 다운로드
4.1 운행 도

원본 다운로드:http://xiazai.jb51.net/201605/yuanma/C-Excel(jb51.net).rar
이상 이 바로 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기