Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 114413|Antwort: 15

[Quelle] . NPOI-Lese- und Schreiboperation Excel-Tabellen-Plug-in für Net

[Link kopieren]
Veröffentlicht am 21.09.2015 18:45:03 | | |

1. Die gesamte Excel-Tabelle wird als Arbeitsblatt bezeichnet: Arbeitsbuch und enthält eine Seite (Arbeitsblatt): Tabelle; Reihe: Reihe; Zelle.

2. NPOI ist die C#-Version von POI, und der Index der NPOI-Zeilen und -Spalten beginnt bei 0

3. Es gibt zwei Formate für POI-Lesen von Excel, eines ist HSSF und das andere XSSF. Die Unterschiede zwischen HSSF und XSSF sind wie folgt:
HSSF ist die reine Java-Implementierung des Dateiformats Excel '97(-2007) des POI-Projekts.
XSSF ist die reine Java-Implementierung des Excel 2007 OOXML (.xlsx) Dateiformats des POI-Projekts.
Das heißt, HSSF gilt für Versionen vor 2007, und XSSF gilt für 2007 und höher.

Im Folgenden ist ein Beispiel für die Verwendung von NPOI zum Lesen und Schreiben von Excel: Die Funktion von ExcelHelper besteht darin, Daten von einer DataTable in Excel zu schreiben oder Daten aus Excel in eine DataTable zu lesen.

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 kopieren

NPOI 2.2.0.0.part01.rar (1 MB, Anzahl der Downloads: 13)

NPOI 2.2.0.0.part02.rar (1 MB, Anzahl der Downloads: 11) NPOI 2.2.0.0.part03.rar (1 MB, Anzahl der Downloads: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, Anzahl der Downloads: 1)







Vorhergehend:[Original] Unicode-Verschlüsselungs-Entschlüsselungswerkzeug, beginnend mit &quot;\u&quot;
Nächster:Eine Vorlage für ein "Abschlussprojekt", die dem Abschluss von Computerwissenschaftssoftware gewidmet ist
 Vermieter| Veröffentlicht am 01.11.2018 12:58:33 |
 Vermieter| Veröffentlicht am 14.05.2021 17:27:51 |
Veröffentlicht am 17.09.2021 13:58:09 |
Kleine Schlampe Veröffentlicht am 17.9.2021 12:35
Debuggen und lösen Sie es selbst

Der Index liegt außerhalb des Geltungsbereichs, es ist nichts weiter als Ihre Datentabelle mit insgesamt 10 Datenzeilen, Sie lesen die elfte Zeile, oder Sie haben insgesamt 5 ...

Der Beispielcode erhält diesen Fehler ohne den Header bool isFirstRowColumn=false, und wenn er mit dem Header liegt, ist alles in Ordnung
Veröffentlicht am 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Veröffentlicht am 02.05.2018 16:08:02 |
Dieser Beitrag wurde zuletzt von QWERTYU am 2.5.2018 um 16:52 Uhr bearbeitet

Ausführende Fehler: Kann keinen Textwert aus einer numerischen Zelle erhalten Lösung:Formatiere die Zellen

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


Veröffentlicht am 29.06.2019 16:03:00 |
Danke, danke, vielen, vielen Dank
Veröffentlicht am 12.09.2021 10:12:16 |

Einfache Ergänzungen, Löschungen und Änderungen an Suchseiten implementieren
Veröffentlicht am 17.09.2021 09:32:23 |
Schau es dir an.
Veröffentlicht am 17.09.2021 09:49:37 |
Ausnahme ausgelöst: "System.IndexOutOfRangeException" (in System.Data.dll)
Exception: 无法找到列 0。
 Vermieter| Veröffentlicht am 17.09.2021 09:55:07 |
fyxh66 veröffentlicht am 17.9.2021 09:49
Ausnahme ausgelöst: "System.IndexOutOfRangeException" (in System.Data.dll)
Exception: 无法找到列 0。 ...

Der Index liegt außerhalb des Geltungsbereichs

Später gebe ich dir einen neuen Artikel zur Referenz
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com