C\#NPOI 를 통 해 Excel 을 조작 하 는 인 스 턴 스 코드

7654 단어 npoiexcel
C\#Excel 을 조작 하 는 방법 은 여러 가지 가 있 는데 흔히 볼 수 있 는 것 은 마이크로소프트 공식 OLE Automation,Apache 의 POI 등 이 있다.여기 서 소개 하 는 것 은 POI 를 C\#로 번역 한 NPOI 다.
POI 는 아파 치가 Java 를 통 해 Office 를 조작 하 는 API 로 Excel,Word,PPT 등 을 조작 할 수 있어 매우 강력 하 다.그리고 C\#버 전의 NPOI 로 번역 되 었 습 니 다.log4j 와 log4net 이 비슷 합 니 다.
NPOI 의.net 4.0 버 전 전에는 office 2007 이상 XML 형식 은 지원 되 지 않 았 던 것 같 지만 최신 버 전 은 지원 되 었 습 니 다.아래 다섯 개의 프로그램 집합 을 다운로드 하고 인용 하면 사용 할 수 있다.

여기 서 엑셀 을 조작 하 는 클래스 를 제공 합 니 다.클래스 에서 4 가지 방법 을 제공 합 니 다.두 가지 내 보 내기,두 가지 가 져 오기.DataSet 을 통 해 여러 개의 Sheet 을 가 진 Excel 파일 을 내 보 낼 수도 있 고,DataTable 을 통 해 하나의 Sheet 을 가 진 Excel 을 내 보 낼 수도 있다.가 져 오 는 것 도 마찬가지 입 니 다.지정 한 Sheet 색인 을 통 해 DataTable 을 내 보 내 거나 모든 Sheet 을 내 보 내 DataSet 으로 되 돌려 줍 니 다.

public class ExcelHelper
  {
    /// <summary>
    ///   Excel Sheet  DataTable
    /// </summary>
    /// <param name="filePath">Excel    </param>
    /// <param name="sheetIndex">Sheet  </param>
    /// <returns>DataTable</returns>
    public static DataTable GetDataTable(string filePath, int sheetIndex)
    {
      return GetDataSet(filePath, sheetIndex).Tables[0];
    }

    /// <summary>
    ///   Excel  DataSet
    /// </summary>
    /// <param name="filePath">Excel    </param>
    /// <param name="sheetIndex">Sheet  ,  ,      Sheet</param>
    /// <returns>DataSet</returns>
    public static DataSet GetDataSet(string filePath, int? sheetIndex = null)
    {
      DataSet ds = new DataSet();
      IWorkbook fileWorkbook;
      using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
      {
        if (filePath.Last() == 's')
        {
          try
          {
            fileWorkbook = new HSSFWorkbook(fs);
          }
          catch (Exception ex)
          {
            throw ex;
          }
        }
        else
        {
          try
          {
            fileWorkbook = new XSSFWorkbook(fs);
          }
          catch
          {
            fileWorkbook = new HSSFWorkbook(fs);
          }
        }
      }

      for (int i = 0; i < fileWorkbook.NumberOfSheets; i++)
      {
        if (sheetIndex != null && sheetIndex != i)
          continue;
        DataTable dt = new DataTable();
        ISheet sheet = fileWorkbook.GetSheetAt(i);

        //  
        IRow header = sheet.GetRow(sheet.FirstRowNum);
        List<int> columns = new List<int>();
        for (int j = 0; j < header.LastCellNum; j++)
        {
          object obj = GetValueTypeForXLS(header.GetCell(j) as HSSFCell);
          if (obj == null || obj.ToString() == string.Empty)
          {
            dt.Columns.Add(new DataColumn("Columns" + j.ToString()));
          }
          else
            dt.Columns.Add(new DataColumn(obj.ToString()));
          columns.Add(j);
        }
        //  
        IEnumerator rows = sheet.GetEnumerator();
        while (rows.MoveNext())
        {
          int j = sheet.FirstRowNum + 1;
          DataRow dr = dt.NewRow();
          bool hasValue = false;
          foreach (int K in columns)
          {
            dr[K] = GetValueTypeForXLS(sheet.GetRow(K).GetCell(K) as HSSFCell);
            if (dr[K] != null && dr[K].ToString() != string.Empty)
            {
              hasValue = true;
            }
          }
          if (hasValue)
          {
            dt.Rows.Add(dr);
          }
          j++;
        }
        ds.Tables.Add(dt);
      }

      return ds;
    }

    /// <summary>
    ///   DataTable  Excel
    /// </summary>
    /// <param name="dt">DataTable</param>
    /// <param name="file">    </param>
    public static void GetExcelByDataTable(DataTable dt, string file)
    {
      DataSet ds = new DataSet();
      ds.Tables.Add(dt);
      GetExcelByDataSet(ds, file);
    }

    /// <summary>
    ///   DataSet  Excel
    /// </summary>
    /// <param name="ds">DataSet</param>
    /// <param name="file">    </param>
    public static void GetExcelByDataSet(DataSet ds, string file)
    {
      IWorkbook fileWorkbook = new HSSFWorkbook();
      int index = 0;
      foreach (DataTable dt in ds.Tables)
      {
        index++;
        ISheet sheet = fileWorkbook.CreateSheet("Sheet" + index);

        //  
        IRow row = sheet.CreateRow(0);
        for (int i = 0; i < dt.Columns.Count; i++)
        {
          ICell cell = row.CreateCell(i);
          cell.SetCellValue(dt.Columns[i].ColumnName);
        }

        //  
        for (int i = 0; i < dt.Rows.Count; i++)
        {
          IRow row1 = sheet.CreateRow(i + 1);
          for (int j = 0; j < dt.Columns.Count; j++)
          {
            ICell cell = row1.CreateCell(j);
            cell.SetCellValue(dt.Rows[i][j].ToString());
          }
        }
      }

      //      
      MemoryStream stream = new MemoryStream();
      fileWorkbook.Write(stream);
      var buf = stream.ToArray();

      //   Excel  
      using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
      {
        fs.Write(buf, 0, buf.Length);
        fs.Flush();
      }
    }

    /// <summary>
    ///                   
    /// </summary>
    /// <param name="cell">   </param>
    /// <returns>  </returns>
    private static object GetValueTypeForXLS(HSSFCell cell)
    {
      if (cell == null)
        return null;
      switch (cell.CellType)
      {
        case CellType.Blank: //BLANK:
          return null;
        case CellType.Boolean: //BOOLEAN:
          return cell.BooleanCellValue;
        case CellType.Numeric: //NUMERIC:
          return cell.NumericCellValue;
        case CellType.String: //STRING:
          return cell.StringCellValue;
        case CellType.Error: //ERROR:
          return cell.ErrorCellValue;
        case CellType.Formula: //FORMULA:
        default:
          return "=" + cell.CellFormula;
      }
    }
  }

이 안 에는 버 전 호환성 문제 와 같은 재 미 있 는 조작 이 있 을 수 있다.여 기 는 다 중 호 환 을 통 해 잘 이 루어 졌 습 니 다.그러나 2007 버 전의 xlsm 이 xsl 접미사 로 수정 되면 어떻게 합 니까?또는 2003 버 전의 xlsm 접미사 로 수정 되면 어떻게 합 니까?2003 버 전 을 xlsm 으로 바 꾸 면 xls 로 처리 할 수 있 지만 2007 년 에 xls 로 바 꾸 면 안 됩 니 다.이 때 파일 의 접미사 이름 을 강제로 수정 해서 열 수 있 습 니 다.
그러나 위의 코드 가 이 기능 을 실현 하지 못 한 두 가지 원인 은 첫째,이렇게 하 는 것 이 안전 하지 않다 는 것 이다.2.이 럴 때 시스템 의 다른 곳 에서 이 파일 의 파일 이름 을 수정 해 야 합 니 다.클래스 에 넣 기 가 쉽 지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기