Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 114413|Răspunde: 15

[Sursă] . Operația de citire și scriere NPOI plug-in Excel pentru Net

[Copiază linkul]
Postat pe 21.09.2015 18:45:03 | | |

1. Întregul tabel Excel se numește fișă de lucru: Caiet de lucru, și conține o pagină (foaie de lucru): Foaie; Rând: Rând; Celulă.

2. NPOI este versiunea C# a POI, iar indexul rândurilor și coloanelor NPOI începe de la 0

3. Există două formate pentru citirea POI în Excel, unul HSSF și celălalt XSSF. Diferențele dintre HSSF și XSSF sunt următoarele:
HSSF este implementarea Java pură a formatului de fișier Excel '97(-2007) al Proiectului POI.
XSSF este implementarea Java pură a formatului de fișier Excel 2007 OOXML (.xlsx) realizat de Proiectul POI.
Adică, HSSF este aplicabil pentru versiunile anterioare anului 2007, iar XSSF este aplicabil pentru 2007 și cele ulterioare.

Următorul este un exemplu de utilizare a NPOI pentru a citi și scrie Excel: Funcția ExcelHelper este de a scrie date dintr-un DataTable în Excel sau de a citi date din Excel într-un DataTable.

Clasa 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. }
Cod de copiere

NPOI 2.2.0.0.part01.rar (1 MB, Numărul de descărcări: 13)

NPOI 2.2.0.0.part02.rar (1 MB, Numărul de descărcări: 11) NPOI 2.2.0.0.part03.rar (1 MB, Numărul de descărcări: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, Numărul de descărcări: 1)







Precedent:[Original] Instrument de decriptare Unicode care începe cu &quot;\u&quot;
Următor:Un șablon de "proiect de absolvire" dedicat absolvenței software-ului de informatică
 Proprietarul| Postat pe 01.11.2018 12:58:33 |
 Proprietarul| Postat pe 14.05.2021 17:27:51 |
Postat pe 17.09.2021 13:58:09 |
Little slag Postat la 2021-9-17 12:35
Depanează și rezolvă singur

Indexul este în afara domeniului, nu este nimic mai mult decât faptul că tabelul tău de date are în total 10 rânduri de date, citești al 11-lea rând sau ai un total de 5 ...

Codul exemplu va primi această eroare fără header bool isFirstRowColumn=false, iar dacă este cu antetul, va fi în regulă
Postat pe 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Postat pe 02.05.2018 16:08:02 |
Această postare a fost editată ultima dată de QWERTYU la 2018-5-2 16:52

Rulare eroare: Nu se poate obține o valoare text dintr-o celulă numerică Soluție:Formatează celulele

   HSSFCell cell = row.getCell(keyIndex);
   celulă.setTipCelulă(HSSFCell.CELL_TYPE_STRING);


Postat pe 29.06.2019 16:03:00 |
Mulțumesc, mulțumesc, mulțumesc mult
Postat pe 12.09.2021 10:12:16 |

Implementează adăugiri, ștergeri și modificări simple la paginile de căutare
Postat pe 17.09.2021 09:32:23 |
Aruncă o privire
Postat pe 17.09.2021 09:49:37 |
Excepție aruncată: "System.IndexOutOfRangeException" (în System.Data.dll)
Exception: 无法找到列 0。
 Proprietarul| Postat pe 17.09.2021 09:55:07 |
fyxh66 Postat pe 2021-9-17 09:49
Excepție aruncată: "System.IndexOutOfRangeException" (în System.Data.dll)
Exception: 无法找到列 0。 ...

Indexul este în afara domeniului

Mai târziu, îți voi da un articol nou pentru referință
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com