Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 114413|Odgovoriti: 15

[Vir] . Operacija branja in pisanja NPOI, vtičnik Excel za Net

[Kopiraj povezavo]
Objavljeno na 21. 09. 2015 18:45:03 | | |

1. Celotna Excelova tabela se imenuje delovni list: WorkBook, in vsebuje stran (delovni list): Sheet; Veslaj: Veslaj; Celica.

2. NPOI je C# različica POI, indeks vrstic in stolpcev NPOI pa se začne pri 0

3. Obstajata dva formata za branje POI v Excelu, eden je HSSF in drugi XSSF. Razlike med HSSF in XSSF so naslednje:
HSSF je čista Java implementacija formata Excel '97(-2007) za projekt POI.
XSSF je čista Java implementacija formata Excel 2007 OOXML (.xlsx) projekta POI.
To pomeni, da je HSSF uporaben za različice pred letom 2007, XSSF pa za leto 2007 in več.

Spodaj je primer uporabe NPOI za branje in pisanje Excela: Funkcija ExcelHelperja je zapisovanje podatkov iz DataTable v Excel ali branje podatkov iz Excela v DataTable.

ExcelHelper razred:

  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. }
Kopiraj kodo

NPOI 2.2.0.0.part01.rar (1 MB, Število prenosov: 13)

NPOI 2.2.0.0.part02.rar (1 MB, Število prenosov: 11) NPOI 2.2.0.0.part03.rar (1 MB, Število prenosov: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, Število prenosov: 1)







Prejšnji:[Izvirno] Unicode orodje za dešifriranje, ki se začne z &quot;\u&quot;
Naslednji:Predloga "diplomskega projekta", namenjena programski opremi za diplomante računalništva
 Najemodajalec| Objavljeno na 1. 11. 2018 12:58:33 |
 Najemodajalec| Objavljeno na 14. 05. 2021 17:27:51 |
Objavljeno na 17. 09. 2021 13:58:09 |
Mala Objavljeno 17. 9. 2021 ob 12:35
Razhroščujte in rešite sami

Indeks je izven obsega, ni nič drugega kot to, da ima vaša podatkovna tabela skupaj 10 vrstic podatkov, preberete 11. vrstico ali pa imate skupaj 5 ...

Vzorčna koda bo dobila to napako brez glave bool isFirstRowColumn=false, in če je z glavo, bo vse v redu
Objavljeno na 22. 09. 2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Objavljeno na 2. 05. 2018 16:08:02 |
Ta objava je bila nazadnje urejena s strani QWERTYU 2. 5. 2018 ob 16:52

Napaka pri zagonu: Iz številčne celice ni mogoče dobiti besedilne vrednosti Rešitev:Formatiranje celic

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


Objavljeno na 29. 06. 2019 16:03:00 |
Hvala, hvala, najlepša hvala
Objavljeno na 12. 09. 2021 10:12:16 |

Uvedite preproste dodatke, izbrise in spremembe na iskalnih straneh
Objavljeno na 17. 09. 2021 09:32:23 |
Poglej
Objavljeno na 17. 09. 2021 09:49:37 |
Izjema: "System.IndexOutOfRangeException" (v System.Data.dll)
Exception: 无法找到列 0。
 Najemodajalec| Objavljeno na 17. 09. 2021 09:55:07 |
FYXH66 objavljeno 17. 9. 2021 ob 09:49
Izjema: "System.IndexOutOfRangeException" (v System.Data.dll)
Exception: 无法找到列 0。 ...

Indeks je izven obsega

Kasneje vam bom dal nov članek za referenco
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com