See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 114413|Vastuse: 15

[Allikas] . NPOI lugemis- ja kirjutamistoimingu Excel tabeli pistikprogramm Neti jaoks

[Kopeeri link]
Postitatud 21.09.2015 18:45:03 | | |

1. Kogu Exceli tabelit nimetatakse tööleheks: WorkBook, mis sisaldab lehte (töölehte): Sheet; Row: Row; Cell.

2. NPOI on POI C# versioon ning NPOI ridade ja veergude indeks algab nullist

3. Exceli POI lugemiseks on kaks formaati, üks on HSSF ja teine XSSF. HSSF-i ja XSSF-i erinevused on järgmised:
HSSF on POI projekti puhas Java rakendus Excel '97(-2007) failiformaadist.
XSSF on POI projekti puhtalt Java versioon Excel 2007 OOXML (.xlsx) failiformaadist.
See tähendab, et HSSF kehtib versioonidele enne 2007. aastat ja XSSF alates 2007. aastast.

Järgmine on näide NPOI kasutamisest Exceli lugemiseks ja kirjutamiseks: ExcelHelperi funktsioon on kirjutada andmeid DataTable'ist Excelisse või lugeda andmeid Excelist DataTable'i.

ExcelHelperi klass:

  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. }
Kopeeri kood

NPOI 2.2.0.0.part01.rar (1 MB, Allalaadimiste arv: 13)

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







Eelmine:[Originaal] Unicode'i krüpteerimise dekrüpteerimistööriist, mis algab tähega &quot;\u&quot;
Järgmine:"Lõpetamisprojekti" mall, mis on pühendatud arvutiteaduse tarkvara lõpetamisele
 Üürileandja| Postitatud 01.11.2018 12:58:33 |
 Üürileandja| Postitatud 14.05.2021 17:27:51 |
Postitatud 17.09.2021 13:58:09 |
Väike Postitatud 2021-9-17 12:35
Siluge ja lahendage ise

Indeks on väljaspool ulatust, see on lihtsalt see, et sinu andmetabelis on kokku 10 rida, kas loed 11. rida või kokku 5 ...

Näidiskood saab selle vea ilma päise bool'ita isFirstRowColumn=false, ja kui see on päisega, on kõik korras
Postitatud 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Postitatud 02.05.2018 16:08:02 |
Seda postitust toimetas viimati QWERTYU 2018-5-2 kell 16:52

Käivitamisviga: Ei saa tekstiväärtust numbrilisest lahtrist Lahendus:Vorminda lahtrid

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


Postitatud 29.06.2019 16:03:00 |
Aitäh, aitäh, suur aitäh
Postitatud 12.09.2021 10:12:16 |

Rakenda lihtsaid lisamisi, kustutamisi ja muudatusi otsingulehtedel
Postitatud 17.09.2021 09:32:23 |
Vaata
Postitatud 17.09.2021 09:49:37 |
Erand visatud: "System.IndexOutOfRangeException" (System.Data.dll)
Exception: 无法找到列 0。
 Üürileandja| Postitatud 17.09.2021 09:55:07 |
fyxh66 postitatud 2021-9-17 09:49
Erand visatud: "System.IndexOutOfRangeException" (System.Data.dll)
Exception: 无法找到列 0。 ...

Indeks on väljaspool ulatust

Hiljem annan sulle uue artikli viitamiseks
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com