Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 114413|Yanıt: 15

[Kaynak] . NPOI okuma ve yazma operasyonu Excel tablo eklentisi for Net

[Bağlantıyı kopyala]
Yayınlandı 21.09.2015 18:45:03 | | |

1. Tüm Excel tablosu çalışma sayfası olarak adlandırılır: WorkBook, ve içinde bir sayfa (çalışma sayfası): Sheet; Row: Row; Hücre.

2. NPOI, POI'nin C# versiyonudur ve NPOI'nin satır ve sütunlarının indeksi 0'dan başlar

3. Excel için POI okumak için iki format vardır, biri HSSF, diğeri XSSF. HSSF ile XSSF arasındaki farklar şunlardır:
HSSF, POI Projesi'nin Excel '97(-2007) dosya formatının saf Java uygulamasıdır.
XSSF, POI Projesi'nin Excel 2007 OOXML (.xlsx) dosya formatının saf Java uygulamasıdır.
Yani, HSSF 2007 öncesi sürümler için geçerlidir ve XSSF 2007 ve üzeri sürümler için geçerlidir.

Aşağıda Excel'i okumak ve yazmak için NPOI kullanımına bir örnek verilmiştir: ExcelHelper'ın işlevi, veriyi bir DataTable'dan Excel'e yazmak veya verileri Excel'den DataTable'a okumaktır.

ExcelHelper sınıfı:

  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. }
Kopya kodu

NPOI 2.2.0.0.part01.rar (1 MB, İndirme sayısı: 13)

NPOI 2.2.0.0.part02.rar (1 MB, İndirme sayısı: 11) NPOI 2.2.0.0.part03.rar (1 MB, İndirme sayısı: 6) NPOI 2.2.0.0.part04.rar (552.54 KB, İndirme sayısı: 1)







Önceki:[Orijinal] &quot;\u&quot; harfiyle başlayan Unicode şifreleme çözme aracı
Önümüzdeki:Bilgisayar bilimi yazılımı mezuniyetine adanmış bir "mezuniyet projesi" şablonu
 Ev sahibi| Yayınlandı 1.11.2018 12:58:33 |
 Ev sahibi| Yayınlandı 14.05.2021 17:27:51 |
Yayınlandı 17.09.2021 13:58:09 |
Küçük 2021-9-17 tarihinde 12:35 tarihinde yayınlandı
Hata ayıkla, kendin çöz ve

Indeks kapsam kapsamı dışında, veri tablonuzun toplamda 10 satır veri içerdiğinden, 11. satırı okuduğunuzda ya da toplamda 5 satırdan oluşmasından başka bir şey değil ...

Örnek kod bu hatayı başlık bool isFirstRowColumn=false olmadan alır ve başlıkla birlikteyse sorun olmaz
Yayınlandı 22.09.2015 02:45:27 |
~~~~~~~~~~~~~~~~~~~~~~~~~
Yayınlandı 2.05.2018 16:08:02 |
Bu gönderi en son QWERTYU tarafından 2018-5-2 16:52 tarihinde düzenlenmiştir

Çalıştırma hatası: Sayısal hücreden metin değeri alınamıyor Çözüm:Hücreleri formatlayın

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


Yayınlandı 29.06.2019 16:03:00 |
Teşekkürler, teşekkürler, çok teşekkür ederim
Yayınlandı 12.09.2021 10:12:16 |

Arama sayfalarına basit eklemeler, silme ve değişiklikler uygulayın
Yayınlandı 17.09.2021 09:32:23 |
Bir bak
Yayınlandı 17.09.2021 09:49:37 |
İstisna atıldı: "System.IndexOutOfRangeException" (System.Data.dll)
Exception: 无法找到列 0。
 Ev sahibi| Yayınlandı 17.09.2021 09:55:07 |
fyxh66 2021-9-17 09:49 tarihinde gönderildi
İstisna atıldı: "System.IndexOutOfRangeException" (System.Data.dll)
Exception: 无法找到列 0。 ...

Indeks kapsam kapsamı dışında

Sonra, referans için size yeni bir makale vereceğim
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com