Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 114413|Svar: 15

[Källa] . NPOI läs- och skrivoperation Excel-tabellplugin för nätverk

[Kopiera länk]
Publicerad på 2015-09-21 18:45:03 | | |

1. Hela Excel-tabellen kallas ett arbetsblad: Arbetsbok, och den innehåller en sida (arbetsblad): Kalkylblad; Rad: Rodd; Cell.

2. NPOI är C#-versionen av POI, och indexet för NPOI:s rader och kolumner börjar från 0

3. Det finns två format för POI-läsning av Excel, ett är HSSF och det andra är XSSF. Skillnaderna mellan HSSF och XSSF är följande:
HSSF är POI-projektets rena Java-implementation av Excel '97(-2007)-filformatet.
XSSF är POI-projektets rena Java-implementation av Excel 2007 OOXML (.xlsx)-filformatet.
Det vill säga, HSSF gäller versioner före 2007, och XSSF gäller för 2007 och uppåt.

Följande är ett exempel på att använda NPOI för att läsa och skriva Excel: ExcelHelpers funktion är att skriva data från en DataTable till Excel, eller läsa data från Excel till en DataTable.

ExcelHelper-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. }
Kopiera koden

NPOI 2.2.0.0.part01.rar (1 MB, Antal nedladdningar: 13)

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







Föregående:[Ursprunglig] Unicode-krypteringsdekrypteringsverktyg som börjar med &quot;\u&quot;
Nästa:En mall för "examensprojekt" dedikerad till examensbaserad datavetenskapsprogramvara
 Hyresvärd| Publicerad på 2018-11-01 12:58:33 |
 Hyresvärd| Publicerad på 2021-05-14 17:27:51 |
Publicerad på 2021-09-17 13:58:09 |
Lilla slampa Publicerad den 2021-9-17 12:35
Felsök och lös det själv

Indexet ligger utanför räckvidd, det är inget annat än att din datatabell har totalt 10 rader data, du läser den elfte raden, eller du har totalt 5 ...

Exempelkoden får detta fel utan header bool isFirstRowColumn=false, och om det är med headern är det okej
Publicerad på 2015-09-22 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Publicerad på 2018-05-02 16:08:02 |
Detta inlägg redigerades senast av QWERTYU den 2018-5-2 16:52

Körfel: Kan inte få ett textvärde från en numerisk cell Lösning:Formatera cellerna

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


Publicerad på 2019-06-29 16:03:00 |
Tack, tack, tack så mycket
Publicerad på 2021-09-12 10:12:16 |

Implementera enkla tillägg, borttagningar och ändringar på söksidor
Publicerad på 2021-09-17 09:32:23 |
Titta
Publicerad på 2021-09-17 09:49:37 |
Undantag kastat: "System.IndexOutOfRangeException" (i System.Data.dll)
Exception: 无法找到列 0。
 Hyresvärd| Publicerad på 2021-09-17 09:55:07 |
fyxh66 publicerad den 2021-9-17 09:49
Undantag kastat: "System.IndexOutOfRangeException" (i System.Data.dll)
Exception: 无法找到列 0。 ...

Indexet ligger utanför ramarna

Senare ger jag dig en ny artikel som referens
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com