OleDB は、さまざまなデータ ソースへの Microsoft の戦略的な低レベル アプリケーション プログラミング インターフェイスです。このクライアントでは、さまざまな種類のデータベースがサポートされており、DBF ファイルの入出力にもこのデータベース API が使用されます。 OleDB を使用する場合は、必ず名前空間を追加してください:
using System.Data.OleDb;
xlsx ファイルの入力:
private void inputXlsx() { string strConn2; string filePath = inPath; FileInfo fileInfo = new FileInfo(filePath); string directory = fileInfo.DirectoryName; strConn2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';"; string strConnection = string.Format(strConn2, inPath); OleDbConnection conn = new OleDbConnection(strConnection); try { conn.Open(); String tableName = null; DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); tableName = dt.Rows[0][2].ToString().Trim(); OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + tableName + "]", strConnection); oada.Fill(dtOld); conn.Close(); } catch (Exception ex) { conn.Close(); } }
xlsx ファイルの中間処理は必要に応じて異なるため、ここでは処理方法については説明しません。入力処理中に、ファイル内のデータは Datatable データ型形式に変換され、データを一時的に保存するための非常に便利なグリッド仮想テーブルです。
xlsx ファイルのエクスポート: xlsx ファイルの出力プロセスはあまりスムーズではなく、3 つの方法が使用されます。
最初の方法は当然 OleDB であり、始まりと終わりがあります。しかし、実際に使ってみると、この方法はプログラムを実行するためにコンピューターに Excel がインストールされている必要があるだけでなく、Excel のバージョンに対する要件も非常に高く、レジストリを削除すると自滅してしまいます。レジストリを変更するとExcelが直接破壊されてしまいます。実際、対応するバージョンの Excel が顧客のマシンにインストールされている必要があることは保証できません。そのため、OleDB を使用してファイルを出力する場合、このクライアントの互換性は非常に低くなります。
いくつかのコミュニケーションと格闘の後、方法を変更し、サードパーティのコンポーネントを使用することにしました。 JAVA 側は POI を使用するため、ここでは POI プロジェクトの .NET バージョンである NPOI が直接使用されます。オンライン チュートリアルが多数あり、実装は簡単ですが、テストした結果、この方法は大きなファイルの入出力をあまりサポートしていません。デモ ファイルの処理には問題ありませんが、10 万または 100 万ものファイルに置き換えられます。実際の顧客から提供されたレベル ファイルを使用すると、クライアントは出力プロセス中に直接クラッシュします。
情報を確認した後、ネチズンは大きなファイルにはEPPlusを使用することを推奨しました。チュートリアルも多数あり、テストのためにファイル サイズを増やすことはしませんでしたが、お客様から提供された数十のファイルはすべてテストに合格し、基本的には 100 万未満でした。
コードに移動します:
private void outputXlsx() { FileInfo newFile = new FileInfo(dtNew.TableName + ".xlsx"); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(dtNew.TableName + ".xlsx"); } using (ExcelPackage package = new ExcelPackage(newFile)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dtNew.TableName);//创建worksheet for (int m = 0; m < dtNew.Columns.Count; m++) { worksheet.Cells[1, m + 1].Value = dtNew.Columns[m]; } int i = 1; foreach (DataRow dr in dtNew.Rows) { for (int j = 0; j < dtNew.Columns.Count; j++) { worksheet.Cells[i + 1, j + 1].Value = dr[j]; } i++; } package.Save();//保存excel } }