オブジェクトのインスタンスに設定されていないスローそのDataTable
とをループそのExcel File
の出力を保存するには、DataGrid
のセル数と行数および列数、またはDataTable
が抽出された場所に応じて時間がかかります。変数の値を有するが、オブジェクト参照が私は<code>DataTable</code>ループと気付い<code>C#</code></p> <p>ため<code>SpreadSheetLight</code>を用い<code>Excel File</code>として保存する機能を有する
BackgroundWorker
を使用する前に、関数が正しく実行されます。 BackgroundWorker
のない唯一のサイドノートは、コード実行中にUIがフリーズすることです。 BackgroundWorker
を利用することによって、私は別のスレッドでsave関数を処理することでこれを排除できることを知っています。
ですが、BackgroundWorker
を私の関数に適用した後、保存関数全体が壊れます。私はObject Reference not set to an instance of an Object
をスローしますが、デバッグしてトレースして、渡された変数の両方に値があり、nullでないことを確信しました。私が使ったループはこれまでと同じで、For Loop
を使ってみました。
ここに私が遭遇したことのスニペットがあります。ご覧のとおり、下のウィンドウは、cell
とvalue
の両方の変数に内容が含まれていることを示しています。まだ私にnull参照を投げます。
BackgroundWorker
を実装しました前に、もともと、この同じコードが働い
public void exportSingleDataGridToExcelFile(DataTable dt) {
using(var sfd = new SaveFileDialog()) {
sfd.FileName = string.Format("WIP Monitoring-{0}", DateTime.Now.ToString("MM.dd.yyyy"));
sfd.Filter = "Excel File (*.xlsx)|*.xlsx";
if(sfd.ShowDialog() == DialogResult.OK) {
clb.Enabled = false;
cb.Enabled = false;
btn.Visible = false;
pb.Visible = true;
pb.Value = 50;
using(var excel = new SLDocument()) {
var style = excel.CreateStyle();
style.SetHorizontalAlignment(DocumentFormat.OpenXml.Spreadsheet.HorizontalAlignmentValues.Center);
style.SetVerticalAlignment(DocumentFormat.OpenXml.Spreadsheet.VerticalAlignmentValues.Center);
var bgw = new BackgroundWorker();
bgw.WorkerReportsProgress = true;
bgw.DoWork += (ss, ee) => {
var worker = ss as BackgroundWorker;
var count = (dt.Rows.Count + 1) * dt.Columns.Count;
var steps = (double) count/100;
var prog = 0.0;
var row = 0;
var col = 0;
//Get Column Headers
foreach(DataColumn dc in dt.Columns) {
var cell = string.Format("{0}1", col.getExCol());
var value = dc.ColumnName;
excel.SetCellValue(cell, value);
excel.AutoFitColumn(string.Format("{0}1", col.getExCol()));
excel.SetCellStyle(string.Format("{0}1", col.getExCol()), style);
prog += steps;
worker.ReportProgress(((int) prog * 100));
col++;
}
col = 0;
//Get Cell Data
foreach(DataRow dr in dt.Rows) {
foreach(DataColumn dc in dt.Columns) {
var cell = string.Format("{0}{1}", col.getExCol(), row);
var value = dr[dc].ToString();
excel.SetCellValue(cell, value);
excel.AutoFitColumn(cell, row);
excel.SetCellStyle(cell, style);
prog += steps;
worker.ReportProgress(((int) prog * 100));
col++;
}
col = 0;
row++;
}
};
bgw.ProgressChanged += (ss, ee) => {
pb.Value = ee.ProgressPercentage/100;
};
bgw.RunWorkerCompleted += (ss, ee) => {
try {
excel.SaveAs(sfd.FileName);
form.Close();
} catch(Exception ex) {
MessageBox.Show(ex.Message, "Error while saving", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
};
bgw.RunWorkerAsync();
}
}
}
}
私の関数の完全なコードです。
私はここを歩くことができますか?
'using'ステートメントの' excel'変数が 'bgw.DoWork'イベントハンドラに渡されません – Claies
非常に良い質問表示btw;多くの情報がうまくレイアウトされています。 –
@Claiesはそれのようです。 – TheQuestioner