Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 114413|Απάντηση: 15

[Πηγή] . Λειτουργία ανάγνωσης και εγγραφής NPOI Προσθήκη πίνακα Excel για το Net

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 21/9/2015 6:45:03 μ.μ. | | |

1. Ολόκληρος ο πίνακας του Excel ονομάζεται φύλλο εργασίας: Βιβλίο εργασίας και περιέχει μια σελίδα (φύλλο εργασίας): Φύλλο; Σειρά: Σειρά; Κύτταρο.

2. Το NPOI είναι η έκδοση C# του POI και το ευρετήριο των γραμμών και στηλών του NPOI ξεκινά από το 0

3. Υπάρχουν δύο μορφές για την ανάγνωση POI του Excel, η μία είναι HSSF και η άλλη είναι XSSF. Οι διαφορές μεταξύ HSSF και XSSF είναι οι εξής:
Το HSSF είναι η καθαρή υλοποίηση Java του POI Project της μορφής αρχείου Excel '97(-2007).
Το XSSF είναι η καθαρή Java υλοποίηση του POI Project της μορφής αρχείου Excel 2007 OOXML (.xlsx).
Δηλαδή, το HSSF ισχύει για εκδόσεις πριν από το 2007 και το XSSF ισχύει για το 2007 και άνω.

Ακολουθεί ένα παράδειγμα χρήσης NPOI για ανάγνωση και εγγραφή Excel: Η λειτουργία του ExcelHelper είναι να γράφει δεδομένα από έναν πίνακα δεδομένων στο Excel ή να διαβάζει δεδομένα από το Excel σε έναν πίνακα δεδομένων.

Κλάση 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. }
Αντιγραφή κώδικα

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)







Προηγούμενος:[Πρωτότυπο] Εργαλείο αποκρυπτογράφησης κρυπτογράφησης Unicode που ξεκινά με &quot;\u&quot;
Επόμενος:Ένα πρότυπο "έργο αποφοίτησης" αφιερωμένο στην αποφοίτηση λογισμικού επιστήμης υπολογιστών
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 1/11/2018 12:58:33 μ.μ. |
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 14/5/2021 5:27:51 μ.μ. |
Δημοσιεύτηκε στις 17/9/2021 1:58:09 μ.μ. |
Μικρή σκωρία Δημοσιεύτηκε στις 2021-9-17 12:35
Εντοπισμός σφαλμάτων και επίλυση μόνοι σας

Το ευρετήριο είναι εκτός πεδίου εφαρμογής, δεν είναι τίποτα άλλο από το ότι ο πίνακας δεδομένων σας έχει συνολικά 10 σειρές δεδομένων, διαβάζετε την 11η σειρά ή έχετε συνολικά 5 ...

Το δείγμα κώδικα θα λάβει αυτό το σφάλμα χωρίς την κεφαλίδα bool isFirstRowColumn=false, και αν είναι με την κεφαλίδα, θα είναι εντάξει
Δημοσιεύτηκε στις 22/9/2015 2:45:27 π.μ. |
~~~~~~~~~~~~~~~~~~~~~~~~~
Δημοσιεύτηκε στις 2/5/2018 4:08:02 μ.μ. |
Αυτό το άρθρο επεξεργάστηκε τελευταία φορά από το χρήστη QWERTYU στις 2018-5-2 16:52

Σφάλμα εκτέλεσης: Δεν είναι δυνατή η λήψη μιας τιμής κειμένου από ένα αριθμητικό κελί Λύση:Μορφοποίηση των κελιών

   Κελί HSSFCell = row.getCell(keyIndex);
   cell.setCellType(HSSFCell.CELL_TYPE_STRING);


Δημοσιεύτηκε στις 29/6/2019 4:03:00 μ.μ. |
Σας ευχαριστώ, σας ευχαριστώ, σας ευχαριστώ πολύ
Δημοσιεύτηκε στις 12/9/2021 10:12:16 π.μ. |

Εφαρμόστε απλές προσθήκες, διαγραφές και αλλαγές στις σελίδες αναζήτησης
Δημοσιεύτηκε στις 17/9/2021 9:32:23 π.μ. |
Ρίξε μια ματιά
Δημοσιεύτηκε στις 17/9/2021 9:49:37 π.μ. |
Εξαίρεση που ρίχτηκε: "System.IndexOutOfRangeException" (στο System.Data.dll)
Exception: 无法找到列 0。
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 17/9/2021 9:55:07 π.μ. |
fyxh66 δημοσιεύτηκε στις 2021-9-17 09:49
Εξαίρεση που ρίχτηκε: "System.IndexOutOfRangeException" (στο System.Data.dll)
Exception: 无法找到列 0。 ...

Ο δείκτης είναι εκτός πεδίου εφαρμογής

Αργότερα, θα σας δώσω ένα νέο άρθρο για αναφορά
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com