Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 114413|Відповідь: 15

[Джерело] . Плагін таблиці Excel для операцій читання та запису NPOI для Net

[Копіювати посилання]
Опубліковано 21.09.2015 18:45:03 | | |

1. Вся таблиця Excel називається робочим аркушем: WorkBook, і містить сторінку (робочий аркуш): Sheet; Ряд: Ряд; Клітина.

2. NPOI — це C#-версія POI, і індекс рядків і стовпців NPOI починається з 0

3. Існує два формати для читання POI в Excel: один — HSSF, інший — XSSF. Відмінності між HSSF і XSSF такі:
HSSF — це чиста Java-реалізація формату файлу Excel '97(-2007) від проєкту POI.
XSSF — це чиста Java-реалізація формату файлу Excel 2007 OOXML (.xlsx) проєкту POI.
Тобто HSSF застосовується до версій до 2007 року, а XSSF — до 2007 року і вище.

Нижче наведено приклад використання NPOI для читання та запису Excel: Функція ExcelHelper полягає у записі даних з DataTable у Excel або читанні даних з Excel у DataTable.

Курс 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, що починається на «\u»
Наступний:Шаблон «випускного проєкту», присвячений випуску програмного забезпечення з комп'ютерних наук
 Орендодавець| Опубліковано 01.11.2018 12:58:33 |
 Орендодавець| Опубліковано 14.05.2021 17:27:51 |
Опубліковано 17.09.2021 13:58:09 |
Little slag Опубліковано 2021-9-17 12:35
Відлагодіть і розв'яжіть це самостійно

Індекс виходить за межі сфери дії, це не більше, ніж ваша таблиця даних має загалом 10 рядків даних, ви читаєте одинадцятий рядок, або маєте загалом 5 ...

Зразковий код отримає цю помилку без заголовка bool isFirstRowColumn=false, і якщо це з заголовком, все буде нормально
Опубліковано 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Опубліковано 02.05.2018 16:08:02 |
Цей допис востаннє редагувався QWERTYU 2018-5-2 16:52

Помилка запуску: Не можу отримати текстове значення з числової комірки Рішення:Форматуйте клітинки

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


Опубліковано 29.06.2019 16:03:00 |
Дякую, дякую, дуже дякую
Опубліковано 12.09.2021 10:12:16 |

Впровадити прості додавання, видалення та зміни на сторінках пошуку
Опубліковано 17.09.2021 09:32:23 |
Подивись
Опубліковано 17.09.2021 09:49:37 |
Викинутий виняток: "System.IndexOutOfRangeException" (у System.Data.dll)
Exception: 无法找到列 0。
 Орендодавець| Опубліковано 17.09.2021 09:55:07 |
fyxh66 опубліковано 2021-9-17 09:49
Викинутий виняток: "System.IndexOutOfRangeException" (у System.Data.dll)
Exception: 无法找到列 0。 ...

Індекс вийшов за межі сфери дії

Пізніше я дам вам нову статтю для довідки
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com