Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 114413|Antwoord: 15

[Bron] . NPOI lees- en schrijfoperatie Excel-tabel plug-in voor Net

[Link kopiëren]
Geplaatst op 21-09-2015 18:45:03 | | |

1. De gehele Excel-tabel wordt een werkblad genoemd: Werkboek, en bevat een pagina (werkblad): Sheet; Rij: Rij; Cel.

2. NPOI is de C#-versie van POI, en de index van NPOI's rijen en kolommen begint bij 0

3. Er zijn twee formaten voor POI-lezen van Excel, één is HSSF en de andere is XSSF. De verschillen tussen HSSF en XSSF zijn als volgt:
HSSF is de pure Java-implementatie van het Excel '97(-2007) bestandsformaat van het POI-project.
XSSF is de pure Java-implementatie van het Excel 2007 OOXML (.xlsx) bestandsformaat van het POI-project.
Dat wil zeggen, HSSF is van toepassing op versies vóór 2007, en XSSF is van toepassing op 2007 en hoger.

Het volgende is een voorbeeld van het gebruik van NPOI om Excel te lezen en te schrijven: De functie van ExcelHelper is om gegevens van een DataTable naar Excel te schrijven, of data uit Excel naar een DataTable te lezen.

ExcelHelper-klasse:

  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. }
Code kopiëren

NPOI 2.2.0.0.part01.rar (1 MB, Aantal downloads: 13)

NPOI 2.2.0.0.part02.rar (1 MB, Aantal downloads: 11) NPOI 2.2.0.0.part03.rar (1 MB, Aantal downloads: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, Aantal downloads: 1)







Vorig:[Origineel] Unicode-encryptie-decryptietool beginnend met &quot;\u&quot;
Volgend:Een "afstudeerproject"-sjabloon gewijd aan afstuderende computerwetenschapssoftware
 Huisbaas| Geplaatst op 01-11-2018 12:58:33 |
 Huisbaas| Geplaatst op 14-05-2021 17:27:51 |
Geplaatst op 17-09-2021 13:58:09 |
Little Geplaatst op 17-9-2021 12:35
Debug en los het zelf op

De index valt buiten de scope, het is niet meer dan dat je datatabel in totaal 10 rijen data heeft, je leest de elfde rij, of je hebt in totaal 5 ...

De voorbeeldcode krijgt deze fout zonder de header bool isFirstRowColumn=false, en als het bij de header is, is het prima
Geplaatst op 22-09-2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Geplaatst op 02-05-2018 16:08:02 |
Dit bericht is voor het laatst bewerkt door QWERTYU op 2 juni 2018 om 16:52

Uitvoerfout: Kan geen tekstwaarde uit een numerieke cel krijgen Oplossing:Formatteren van de cellen

   HSSFCell-cel = row.getCell(keyIndex);
   cel.setCellType(HSSFCell.CELL_TYPE_STRING);


Geplaatst op 29-06-2019 16:03:00 |
Dank je, dank je, heel erg bedankt
Geplaatst op 12-09-2021 10:12:16 |

Implementeer eenvoudige toevoegingen, verwijderingen en wijzigingen in zoekpagina's
Geplaatst op 17-09-2021 09:32:23 |
Kijk eens
Geplaatst op 17-09-2021 09:49:37 |
Uitzondering gegooid: "System.IndexOutOfRangeException" (in System.Data.dll)
Exception: 无法找到列 0。
 Huisbaas| Geplaatst op 17-09-2021 09:55:07 |
fyxh66 geplaatst op 17-9-2021 09:49
Uitzondering gegooid: "System.IndexOutOfRangeException" (in System.Data.dll)
Exception: 无法找到列 0。 ...

De index valt buiten de scope

Later geef ik je een nieuw artikel ter referentie
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com