Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 114413|Respuesta: 15

[Fuente] . Operación de lectura y escritura NPOI complemento de tabla de Excel para Net

[Copiar enlace]
Publicado en 21/9/2015 18:45:03 | | |

1. Toda la tabla de Excel se llama hoja de trabajo: Cuaderno de trabajo, y contiene una página (hoja de cálculo): Hoja; Fila: Rema; Celda.

2. NPOI es la versión en C# de POI, y el índice de las filas y columnas de NPOI comienza desde 0

3. Existen dos formatos para leer Excel, uno es HSSF y el otro es XSSF. Las diferencias entre HSSF y XSSF son las siguientes:
HSSF es la implementación pura en Java del Proyecto POI del formato de archivo Excel '97(-2007).
XSSF es la implementación pura en Java del formato de archivo Excel 2007 OOXML (.xlsx) del Proyecto POI.
Es decir, el HSSF es aplicable a versiones anteriores a 2007, y el XSSF es aplicable a 2007 en adelante.

A continuación se muestra un ejemplo de cómo se usan NPOI para leer y escribir en Excel: La función de ExcelHelper es escribir datos de una DataTable a Excel, o leer datos de Excel a una DataTable.

Clase ExcelHelper:

  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. }
Copiar código

NPOI 2.2.0.0.part01.rar (1 MB, Número de descargas: 13)

NPOI 2.2.0.0.part02.rar (1 MB, Número de descargas: 11) NPOI 2.2.0.0.part03.rar (1 MB, Número de descargas: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, Número de descargas: 1)







Anterior:[Herramienta original] de cifrado Unicode que empieza por &quot;\u&quot;
Próximo:Una plantilla de "proyecto de graduación" dedicada a graduarse en software de informática
 Propietario| Publicado en 1/11/2018 12:58:33 |
 Propietario| Publicado en 14/5/2021 17:27:51 |
Publicado en 17/9/2021 13:58:09 |
Pequeña zorra Publicado el 17-9-2021 12:35
Depura y resuélvelo tú mismo

El índice está fuera de alcance, no es más que tu tabla de datos tiene un total de 10 filas de datos, lees la undécima fila, o tienes un total de 5...

El código de ejemplo recibirá este error sin el bool del encabezado isFirstRowColumn=false, y si es con el encabezado, estará bien
Publicado en 22/9/2015 2:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Publicado en 2/5/2018 16:08:02 |
Esta publicación fue editada por última vez por QWERTYU el 2-5-2018 a las 16:52

Error de ejecución: No se puede obtener un valor de texto de una celda numérica Solución:Formatear las celdas

   HSSFCell cell = row.getCell(keyIndex);
   cel.setTipoCella(HSSFCell.CELL_TYPE_STRING);


Publicado en 29/6/2019 16:03:00 |
Gracias, gracias, muchas gracias
Publicado en 12/9/2021 10:12:16 |

Implementa añadidos, eliminaciones y cambios sencillos en las páginas de búsqueda
Publicado en 17/9/2021 9:32:23 |
Echa un vistazo
Publicado en 17/9/2021 9:49:37 |
Excepción lanzada: "System.IndexOutOfRangeException" (en System.Data.dll)
Exception: 无法找到列 0。
 Propietario| Publicado en 17/9/2021 9:55:07 |
FYXH66 publicado el 17-9-2021 09:49
Excepción lanzada: "System.IndexOutOfRangeException" (en System.Data.dll)
Exception: 无法找到列 0。 ...

El índice está fuera de alcance

Más adelante, te daré un nuevo artículo para referencia
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com