이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 114413|회답: 15

[출처] . NPOI 읽기 및 쓰기 연산 Excel 테이블 플러그인 - Net

[링크 복사]
게시됨 2015. 9. 21. 오후 6:45:03 | | |

1. 전체 엑셀 테이블은 워크시트: 워크북이라고 불리며, 페이지(워크시트)로 구성되어 있습니다: 시트; 로우: 로우; 감방.

2. NPOI는 POI의 C# 버전이며, NPOI의 행과 열의 인덱스는 0부터 시작합니다

3. POI가 엑셀을 읽을 때 두 가지 형식이 있는데, 하나는 HSSF이고 다른 하나는 XSSF입니다. HSSF와 XSSF의 차이점은 다음과 같습니다:
HSSF는 POI 프로젝트의 순수 Java 구현체인 Excel '97(-2007) 파일 형식입니다.
XSSF는 POI 프로젝트가 Excel 2007 OOXML(.xlsx) 파일 형식을 순수 자바로 구현한 버전입니다.
즉, HSSF는 2007년 이전 버전에 적용되며, XSSF는 2007년 이상에 적용됩니다.

다음은 NPOI를 사용해 엑셀을 읽고 쓰는 예시입니다: ExcelHelper의 기능은 DataTable에서 Excel로 데이터를 쓰거나, Excel에서 DataTable으로 데이터를 읽는 것입니다.

엑셀헬퍼 클래스:

  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.UserModel;
  3. using NPOI.XSSF.UserModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Web;

  10. namespace HouPuStudent.Utility
  11. {
  12.     public class ExcelHelper
  13.     {
  14.         private string fileName = null; //文件名
  15.         private IWorkbook workbook = null;
  16.         private FileStream fs = null;
  17.         private bool disposed;

  18.         public ExcelHelper(string fileName)
  19.         {
  20.             this.fileName = fileName;
  21.             disposed = false;
  22.         }

  23.         /// <summary>
  24.         /// 将DataTable数据导入到excel中
  25.         /// </summary>
  26.         /// <param name="data">要导入的数据</param>
  27.         /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
  28.         /// <param name="sheetName">要导入的excel的sheet的名称</param>
  29.         /// <returns>导入数据行数(包含列名那一行)</returns>
  30.         public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
  31.         {
  32.             int i = 0;
  33.             int j = 0;
  34.             int count = 0;
  35.             ISheet sheet = null;

  36.             fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  37.             if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  38.                 workbook = new XSSFWorkbook();
  39.             else if (fileName.IndexOf(".xls") > 0) // 2003版本
  40.                 workbook = new HSSFWorkbook();

  41.             try
  42.             {
  43.                 if (workbook != null)
  44.                 {
  45.                     sheet = workbook.CreateSheet(sheetName);
  46.                 }
  47.                 else
  48.                 {
  49.                     return -1;
  50.                 }

  51.                 if (isColumnWritten == true) //写入DataTable的列名
  52.                 {
  53.                     IRow row = sheet.CreateRow(0);
  54.                     for (j = 0; j < data.Columns.Count; ++j)
  55.                     {
  56.                         row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
  57.                     }
  58.                     count = 1;
  59.                 }
  60.                 else
  61.                 {
  62.                     count = 0;
  63.                 }

  64.                 for (i = 0; i < data.Rows.Count; ++i)
  65.                 {
  66.                     IRow row = sheet.CreateRow(count);
  67.                     for (j = 0; j < data.Columns.Count; ++j)
  68.                     {
  69.                         row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
  70.                     }
  71.                     ++count;
  72.                 }
  73.                 workbook.Write(fs); //写入到excel
  74.                 return count;
  75.             }
  76.             catch (Exception ex)
  77.             {
  78.                 Console.WriteLine("Exception: " + ex.Message);
  79.                 return -1;
  80.             }
  81.         }

  82.         /// <summary>
  83.         /// 将excel中的数据导入到DataTable中
  84.         /// </summary>
  85.         /// <param name="sheetName">excel工作薄sheet的名称</param>
  86.         /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
  87.         /// <returns>返回的DataTable</returns>
  88.         public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
  89.         {
  90.             ISheet sheet = null;
  91.             DataTable data = new DataTable();
  92.             int startRow = 0;
  93.             try
  94.             {
  95.                 fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  96.                 if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  97.                     workbook = new XSSFWorkbook(fs);
  98.                 else if (fileName.IndexOf(".xls") > 0) // 2003版本
  99.                     workbook = new HSSFWorkbook(fs);

  100.                 if (sheetName != null)
  101.                 {
  102.                     sheet = workbook.GetSheet(sheetName);
  103.                     if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
  104.                     {
  105.                         sheet = workbook.GetSheetAt(0);
  106.                     }
  107.                 }
  108.                 else
  109.                 {
  110.                     sheet = workbook.GetSheetAt(0);
  111.                 }
  112.                 if (sheet != null)
  113.                 {
  114.                     IRow firstRow = sheet.GetRow(0);
  115.                     int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数

  116.                     if (isFirstRowColumn)
  117.                     {
  118.                         for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
  119.                         {
  120.                             ICell cell = firstRow.GetCell(i);
  121.                             if (cell != null)
  122.                             {
  123.                                 string cellValue = cell.StringCellValue;
  124.                                 if (cellValue != null)
  125.                                 {
  126.                                     DataColumn column = new DataColumn(cellValue);
  127.                                     data.Columns.Add(column);
  128.                                 }
  129.                             }
  130.                         }
  131.                         startRow = sheet.FirstRowNum + 1;
  132.                     }
  133.                     else
  134.                     {
  135.                         startRow = sheet.FirstRowNum;
  136.                     }

  137.                     //最后一列的标号
  138.                     int rowCount = sheet.LastRowNum;
  139.                     for (int i = startRow; i <= rowCount; ++i)
  140.                     {
  141.                         IRow row = sheet.GetRow(i);
  142.                         if (row == null) continue; //没有数据的行默认是null       

  143.                         DataRow dataRow = data.NewRow();
  144.                         for (int j = row.FirstCellNum; j < cellCount; ++j)
  145.                         {
  146.                             if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
  147.                                 dataRow[j] = row.GetCell(j).ToString();
  148.                         }
  149.                         data.Rows.Add(dataRow);
  150.                     }
  151.                 }

  152.                 return data;
  153.             }
  154.             catch (Exception ex)
  155.             {
  156.                 Console.WriteLine("Exception: " + ex.Message);
  157.                 return null;
  158.             }
  159.         }

  160.         public void Dispose()
  161.         {
  162.             Dispose(true);
  163.             GC.SuppressFinalize(this);
  164.         }

  165.         protected virtual void Dispose(bool disposing)
  166.         {
  167.             if (!this.disposed)
  168.             {
  169.                 if (disposing)
  170.                 {
  171.                     if (fs != null)
  172.                         fs.Close();
  173.                 }

  174.                 fs = null;
  175.                 disposed = true;
  176.             }
  177.         }
  178.     }
  179. }
코드 복사

NPOI 2.2.0.0.part01.rar (1 MB, 다운로드 횟수: 13)

NPOI 2.2.0.0.part02.rar (1 MB, 다운로드 횟수: 11) NPOI 2.2.0.0.part03.rar (1 MB, 다운로드 횟수: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, 다운로드 횟수: 1)







이전의:[원본] 유니코드 암호화 복호화 도구 &quot;\u&quot;로 시작하는 것
다음:컴퓨터 과학 소프트웨어 졸업생을 위한 "졸업 프로젝트" 템플릿
 집주인| 게시됨 2018. 11. 1. 오후 12:58:33 |
 집주인| 게시됨 2021. 5. 14. 오후 5:27:51 |
게시됨 2021. 9. 17. 오후 1:58:09 |
작은 슬래그, 2021-9-17 12:35에 게시됨
직접 디버깅하고 해결하세요

인덱스가 범위를 벗어난 상태입니다. 데이터테이블에 총 10행의 데이터가 있고, 11번째 행을 읽거나, 총 5행 ...

샘플 코드는 헤더 isFirstRowColumn=false 없이도 이 오류가 발생하며, 헤더가 있으면 문제없습니다
게시됨 2015. 9. 22. 오전 2:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
게시됨 2018. 5. 2. 오후 4:08:02 |
이 글은 QWERTYU가 2018년 5월 2일 16:52에 마지막으로 편집했습니다.

실행 오류: 숫자 셀에서 텍스트 값을 얻을 수 없음 해결책:셀 포맷

   HSSFCell 셀 = row.getCell(keyIndex);
   cell.setCellType(HSSFCell.CELL_TYPE_STRING);


게시됨 2019. 6. 29. 오후 4:03:00 |
정말 고마워요, 정말 고마워요
게시됨 2021. 9. 12. 오전 10:12:16 |

검색 페이지에 간단한 추가, 삭제, 변경 사항을 구현하세요
게시됨 2021. 9. 17. 오전 9:32:23 |
보세요
게시됨 2021. 9. 17. 오전 9:49:37 |
예외 투입: "System.IndexOutOfRangeException" (System.Data.dll 내)
Exception: 无法找到列 0。
 집주인| 게시됨 2021. 9. 17. 오전 9:55:07 |
FYXH66이 2021-9-17 09:49에 게시됨
예외 투입: "System.IndexOutOfRangeException" (System.Data.dll 내)
Exception: 无法找到列 0。 ...

이 색인은 범위 밖입니다

나중에 참고할 새 기사를 드릴게요
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com