Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 114413|Svare: 15

[Kilde] . NPOI lese- og skriveoperasjon Excel-tabellplugin for Net

[Kopier lenke]
Publisert på 21.09.2015 18:45:03 | | |

1. Hele Excel-tabellen kalles et regneark: Arbeidsbok, og den inneholder en side (regneark): Ark; Rad: Ro; Celle.

2. NPOI er C#-versjonen av POI, og indeksen for NPOIs rader og kolonner starter fra 0

3. Det finnes to formater for POI som leser Excel, ett er HSSF og det andre er XSSF. Forskjellene mellom HSSF og XSSF er som følger:
HSSF er POI-prosjektets rene Java-implementering av Excel '97(-2007)-filformatet.
XSSF er POI-prosjektets rene Java-implementering av Excel 2007 OOXML (.xlsx) filformatet.
Det vil si at HSSF gjelder for versjoner før 2007, og XSSF gjelder for 2007 og nyere.

Følgende er et eksempel på bruk av NPOI for å lese og skrive Excel: Funksjonen til ExcelHelper er å skrive data fra en DataTable til Excel, eller lese data fra Excel til en DataTable.

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. }
Kopier koden

NPOI 2.2.0.0.part01.rar (1 MB, Antall nedlastinger: 13)

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







Foregående:[Original] Unicode-krypteringsdekrypteringsverktøy som starter med &quot;\u&quot;
Neste:En mal for "graduation project" dedikert til å uteksaminere datavitenskapsprogramvare
 Vert| Publisert på 01.11.2018 12:58:33 |
 Vert| Publisert på 14.05.2021 17:27:51 |
Publisert på 17.09.2021 13:58:09 |
Lille slagg Publisert 2021-9-17 12:35
Feilsøk og løs det selv

Indeksen er utenfor omfang, det er ikke mer enn at datatabellen din har totalt 10 rader med data, du leser den 11. raden, eller du har totalt 5 ...

Eksempelkoden vil få denne feilen uten headeren bool isFirstRowColumn=false, og hvis det er med headeren, vil det være greit
Publisert på 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Publisert på 02.05.2018 16:08:02 |
Dette innlegget ble sist redigert av QWERTYU 2018-5-2 kl. 16:52

Kjørefeil: Kan ikke hente en tekstverdi fra en numerisk celle Løsning:Formater cellene

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


Publisert på 29.06.2019 16:03:00 |
Tusen takk, tusen takk, tusen takk
Publisert på 12.09.2021 10:12:16 |

Implementer enkle tillegg, slettinger og endringer på søkesider
Publisert på 17.09.2021 09:32:23 |
Ta en titt
Publisert på 17.09.2021 09:49:37 |
Unntak kastet: "System.IndexOutOfRangeException" (i System.Data.dll)
Exception: 无法找到列 0。
 Vert| Publisert på 17.09.2021 09:55:07 |
fyxh66 publisert 17.09.2021 09:49
Unntak kastet: "System.IndexOutOfRangeException" (i System.Data.dll)
Exception: 无法找到列 0。 ...

Indeksen er utenfor omfanget

Senere skal jeg gi deg en ny artikkel til referanse
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com