相互コンダクタンスとExcelのデータテーブルの間
1.プロジェクトへの参照を追加しますNPOI
- NPOIプロジェクト:
NPOIは、Excelを読み書きするオープンソースのC#でWORDや他のプロジェクトコンポーネントのMicrosoft OLE2ドキュメント、それはOfficeをインストールせずに読み込むと、WordやExcelの文書に書き込むことができるということです。そして、Officeの古いバージョン(2003年〜)とOffice(2007+)の新バージョンでは、より良いサポートを持っています。あなたがNPOI淘宝網の観点から慎重に検討、専門書が欲しいNPOI場合は非常に強力なNPOIは、ExcelやWordの文書すべての詳細を操作することができ、もちろん、また、その文書やデモを表示するNPOIの公式ウェブサイトをアクセスすることができます。
- Excelの.XLSと.xlsxの拡張子の説明について:
.XLS Excel2003が保存され、ファイル形式、古いバージョンとそのエクセルの新しいバージョンの以前のバージョンでは、Excelファイルのの.xlsx形式には互換性が保存されているとExcel2007のデフォルトのそれ以降のバージョンでは、このフォーマットはExcel2007することができおよびそれ以降のバージョンと互換性があり、エクセルの古いバージョンでは開くことができません。
- NPOIのプロジェクト参照:
使用VisualStudioをは、NuGetは、パッケージマネージャを開くNPOIを検索し、現在のプロジェクトに追加しました。
2. [インポートエクセルDataSetにファイル(データテーブル)
シートのExcelファイルの複数のページが存在し得るので、方法は、好ましくは、C#Excel文書構造対応するデータセットのクラスで使用され、すなわち、データセットを使用して、Excelの、それぞれのMicrosoft Excel DataTabelに対応するデータセットにエクスポート(データテーブルの複数を含んでいてもよいです)シートページ。
方法の説明:このメソッドは、Excelのデータセットにファイルでは、各Excelシートは導入データセットデータテーブルに格納されたページを生成し、シートSHEETNAMEの各々とデータテーブルのTableName 1つの対応のそれぞれ。IsFirstLineColumnNameパラメータは、ヘッダファイルかどうかをエクセルの最初の行のそれぞれを表すために使用されます。
コードは以下の通りであります:
/// <まとめ> /// にEXECLデータテーブル(データセット)にデータを読み出す /// </要約> /// <PARAM NAME = "filePathには"> ファイルパスEXECL指定</ PARAM> /// <PARAMをNAME = "isFirstLineColumnNameは"> 最初の行は列名で設定されている</ PARAM> /// <リターン> データテーブル設定データ戻り</戻り> パブリック 静的のdataSet ExcelToDataSet(文字列 filePathに、BOOL isFirstLineColumnName)を { データセットのdataSet = 新しいデータセット(); int型 startRow属性= 0 ; 試します { 使用(のFileStream FS = File.OpenRead(filePathに)) { ワークブックIWorkbook = ヌル; // エクセルの場合は2007+バージョン IF(filePath.IndexOf(" の.xlsx ")> 0 ) { ワークブック = 新しいXSSFWorkbook(FS)。 } // それはの2003年〜Excelのバージョンである場合は 、他の IF(filePath.IndexOf(" .XLSは")> 0 ) { ワークブック = 新しいHSSFWorkbook(FS)。 } もし(ワークブック!= nullの) { // それぞれのサイクルは、各シートがページデータテーブルに変換され、データセットに配置され、Excelシートを読み取る ための(INT P = 0 ; P <workbook.NumberOfSheets; P ++ ) { ISheetシート = workbook.GetSheetAt(P)。 DataTableのdataTable = 新しいDataTableを(); dataTable.TableName = sheet.SheetName。 もし(シート!= nullの) { int型をrowCount = sheet.LastRowNumを; // 行の数を取得 IF(をrowCount> 0 ) { IRow FIRSTROW = sheet.GetRowは(0); // 最初の行を取得 INT CellCount = firstRow.LastCellNum; // 列の合計数を取得します // データテーブルの列を構築する IF (isFirstLineColumnName) { startRow属性は = 1 ; // 最初の行が二行目から読み出した列名の場合 のために(INT I = firstRow.FirstCellNum; IはCellCount <; ++ I) { ICELLセル = firstRow.GetCell(I)。 もし(セル!= nullの) { もし(cell.StringCellValue!= nullの) { DataColumnカラム = 新規のDataColumn(cell.StringCellValue)。 dataTable.Columns.Add(列); } } } } 他 { 以下のために(int型私= firstRow.FirstCellNum;私はcellCountを<; ++ I) { DataColumnカラム = 新規のDataColumn(" カラム" +(I + 1 ))。 dataTable.Columns.Add(列); } } // 行を埋める ために(int型 I = startRow属性; I <=をrowCount; ++ I) { IRow行 = sheet.GetRow(I)。 もし(行== NULL)を続けます。 DataRowのDataRow = dataTable.NewRow()。 以下のための(int型 J = row.FirstCellNumあり、j <cellCount; ++ J) { ICELLセル = row.GetCell(J)。 もし(セル== nullの) { DataRow [J] = "" ; } 他 { // CellType(不明= -1、数値= 0、列= 1、式= 2、ブランク= 3、ブール= 4、エラー= 5) スイッチ(cell.CellType) { ケースCellType.Blank: DataRow [J] = "" ; BREAK ; ケースCellType.Numeric: ショート形式= cell.CellStyle.DataFormat; // 時間処理フォーマット(等2015.12.5,2015 / 12 / 5,2015-12-5) 場合(フォーマットは== 14 ||フォーマット== 31はフォーマットが== || 57である ||フォーマット== 58 ) DataRow [J] = cell.DateCellValue。 他 のDataRow [J] = cell.NumericCellValue。 破ります; ケースCellType.String: DataRow [J] = cell.StringCellValue。 破ります; } } } dataTable.Rows.Add(のDataRow)。 } } } dataSet.Tables.Add(のdataTable)。 } } } 返すデータセットを。 } キャッチ(例外) { リターン ヌル。 } }
(DataTableの)3. DataSetはExcelファイルとしてエクスポート
符号の説明:我々は、すべてのデータテーブルデータセットにエクスポートすることができるデータセットは、Excelファイルとしてエクスポートし、パラメータを渡すために使用される方法は、エクスポートExcelファイルパスをOUTPATH、パスは、Excel(.XLSまたは.xlsx形式)の拡張に添加することができます拡張子.XLSでデフォルトのエクスポートせずに、Excelファイルを増加させないかもしれません。
/// <summary>
/// 将DataTable(DataSet)导出到Execl文档
/// </summary>
/// <param name="dataSet">传入一个DataSet</param>
/// <param name="Outpath">导出路径(可以不加扩展名,不加默认为.xls)</param>
/// <returns>返回一个Bool类型的值,表示是否导出成功</returns>
/// True表示导出成功,Flase表示导出失败
public static bool DataTableToExcel(DataSet dataSet, string Outpath)
{
bool result = false;
try
{
if (dataSet == null || dataSet.Tables == null || dataSet.Tables.Count == 0 || string.IsNullOrEmpty(Outpath))
throw new Exception("输入的DataSet或路径异常");
int sheetIndex = 0;
//根据输出路径的扩展名判断workbook的实例类型
IWorkbook workbook = null;
string pathExtensionName = Outpath.Trim().Substring(Outpath.Length - 5);
if (pathExtensionName.Contains(".xlsx"))
{
workbook = new XSSFWorkbook();
}
else if(pathExtensionName.Contains(".xls"))
{
workbook = new HSSFWorkbook();
}
else
{
Outpath = Outpath.Trim() + ".xls";
workbook = new HSSFWorkbook();
}
//将DataSet导出为Excel
foreach (DataTable dt in dataSet.Tables)
{
sheetIndex++;
if (dt != null && dt.Rows.Count > 0)
{
ISheet sheet = workbook.CreateSheet(string.IsNullOrEmpty(dt.TableName) ? ("sheet" + sheetIndex) : dt.TableName);//创建一个名称为Sheet0的表
int rowCount = dt.Rows.Count;//行数
int columnCount = dt.Columns.Count;//列数
//设置列头
IRow row = sheet.CreateRow(0);//excel第一行设为列头
for (int c = 0; c < columnCount; c++)
{
ICell cell = row.CreateCell(c);
cell.SetCellValue(dt.Columns[c].ColumnName);
}
//设置每行每列的单元格,
for (int i = 0; i < rowCount; i++)
{
row = sheet.CreateRow(i + 1);
for (int j = 0; j < columnCount; j++)
{
ICell cell = row.CreateCell(j);//excel第二行开始写入数据
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
}
}
//向outPath输出数据
using (FileStream fs = File.OpenWrite(Outpath))
{
workbook.Write(fs);//向打开的这个xls文件中写入数据
result = true;
}
return result;
}
catch (Exception ex)
{
return false;
}
}
}
4.上面两个方法的使用方法
将上面两个方法都定义在ExcelHelper类中,使用如下代码使用:
DataSet set = ExcelHelper.ExcelToDataTable("test.xlsx", true);//Excel导入
bool b = ExcelHelper.DataTableToExcel(set, "test2.xlsx");//导出Excel