using DevExpress.Utils.Drawing.Helpers; using ICSharpCode.Core; using Mesnac.Action.Base; using Mesnac.Action.ChemicalWeighing.Entity.Report; using Microsoft.Office.Interop.Excel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Mesnac.Action.ChemicalWeighing.Report.GelDoser { /// /// 糊化机报表导出事件 /// public class ExportAction : ChemicalWeighingAction, Base.IAction { private Control _clientGridControl = null; //报表明细DGV private DbMCControl _dgvGelDoser = null; //报表数据DGV public void Run(RuntimeParameter runtime) { base.RunIni(runtime); //必须要调用的 ICSharpCode.Core.LoggingService.Debug("糊化机报表-导出..."); this._dgvGelDoser = this.GetDbMCControlByKey(Mesnac.Basic.DataSourceFactory.MCDbType.Local, "Report_GelDoser").FirstOrDefault(); DataGridView _GelDoserGridView = this._dgvGelDoser.BaseControl as DataGridView; if (_GelDoserGridView != null) { GelDoserDos_Water gelDoserDos = new GelDoserDos_Water(); gelDoserDos.eqNo = ParseToInt(_GelDoserGridView.SelectedRows[0].Cells["eqNo"].Value.ToString()); gelDoserDos.dos = ParseToInt(_GelDoserGridView.SelectedRows[0].Cells["dos"].Value.ToString()); gelDoserDos.batch = ParseToInt(_GelDoserGridView.SelectedRows[0].Cells["batch"].Value.ToString()); gelDoserDos.matCode = ParseToInt(_GelDoserGridView.SelectedRows[0].Cells["matCode"].Value.ToString()); gelDoserDos.setValue = Convert.ToDouble(_GelDoserGridView.SelectedRows[0].Cells["setValue"].Value); gelDoserDos.setToler = Convert.ToDouble(_GelDoserGridView.SelectedRows[0].Cells["setToler"].Value); gelDoserDos.actValue = Convert.ToDouble(_GelDoserGridView.SelectedRows[0].Cells["actValue"].Value); gelDoserDos.actToLer = Convert.ToDouble(_GelDoserGridView.SelectedRows[0].Cells["actToLer"].Value); gelDoserDos.recordTime = _GelDoserGridView.SelectedRows[0].Cells["recordTime"].Value.ToString(); SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "xls files(*.xls)|*.xls"; sfd.FileName = String.Format("糊化机报表_{0:yyyyMMdd}", DateTime.Now); sfd.AddExtension = true; DialogResult result = sfd.ShowDialog(); if (result == DialogResult.OK) { this._clientGridControl = GetAllControls().Where(x => x.Name.Contains("MultiColHeaderDgv")).FirstOrDefault(); if (_clientGridControl == null) { ICSharpCode.Core.LoggingService.Warn("{生产报表} 缺少缺少称量名细MultiColHeaderDgv控件..."); runtime.IsReturn = false; return; } Mesnac.Controls.Default.MultiColHeaderDgv clientGrid = (this._clientGridControl as Mesnac.Controls.Default.MultiColHeaderDgv); System.Data.DataTable dt = clientGrid.DataSource as System.Data.DataTable; string fileName = sfd.FileName; if (!String.IsNullOrEmpty(fileName)) { try { //写入Excle DataTabletoExcel(fileName, dt, gelDoserDos); string msg1 = "糊化机报表导出成功"; //导出生产报表数据至Excel成功! ICSharpCode.Core.LoggingService.Info(msg1); MessageBox.Show(msg1, Mesnac.Basic.LanguageHelper.Caption, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { string msg1 = $"糊化机报表导出异常:{ex.Message}"; ICSharpCode.Core.LoggingService.Error(msg1); MessageBox.Show(msg1, Mesnac.Basic.LanguageHelper.WarnCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } } } /// /// 写入到Excel文件 /// /// /// /// public void DataTabletoExcel(string strFileName, System.Data.DataTable tmpDataTable, GelDoserDos_Water gelDoserDos) { ///先得到datatable的行数 int rowNum = tmpDataTable.Rows.Count; ///列数 int columnNum = tmpDataTable.Columns.Count; ///声明一个应用程序类实例 Microsoft.Office.Interop.Excel.Application xlApp = new ApplicationClass(); //创建一个新工作簿 Workbook xlBook = xlApp.Workbooks.Add(); ///在工作簿中得到sheet。 _Worksheet oSheet = (_Worksheet)xlBook.Worksheets[1]; #region 绘制列 //绘制配方名和开始时间 oSheet.Cells[1, 1] = "设备"; oSheet.Cells[1, 2] = "Dos"; oSheet.Cells[1, 3] = "批次号"; oSheet.Cells[1, 4] = "物料代码"; oSheet.Cells[1, 5] = "设定重量"; oSheet.Cells[1, 6] = "设定公差"; oSheet.Cells[1, 7] = "实际重量"; oSheet.Cells[1, 8] = "实际公差"; oSheet.Cells[1, 9] = "记录时间"; oSheet.Cells[2, 1] = gelDoserDos.eqNo; oSheet.Cells[2, 2] = gelDoserDos.dos; oSheet.Cells[2, 3] = gelDoserDos.batch; oSheet.Cells[2, 4] = gelDoserDos.matCode; oSheet.Cells[2, 5] = gelDoserDos.setValue; oSheet.Cells[2, 6] = gelDoserDos.setToler; oSheet.Cells[2, 7] = gelDoserDos.actValue; oSheet.Cells[2, 8] = gelDoserDos.setToler; oSheet.Cells[2, 9] = gelDoserDos.recordTime; //自定义方法,绘制合并表头 oSheet.Cells[3, 1] = "设备"; oSheet.Cells[3, 2] = "Mix"; oSheet.Cells[3, 3] = "批次"; oSheet.Cells[3, 4] = "步号"; oSheet.Cells[3, 5] = "动作"; oSheet.Cells[3, 6] = "时间"; oSheet.Cells[3, 7] = "温度"; oSheet.Cells[3, 8] = "速度"; oSheet.Cells[3, 9] = "记录时间"; #endregion //将DataTable中的数据导入Excel中 for (int i = 0; i < rowNum; i++) { for (int j = 0; j < columnNum; j++) { ///excel中的列是从1开始的 xlApp.Cells[i + 4, j + 1] = tmpDataTable.Rows[i][j].ToString(); } } oSheet.SaveAs(strFileName); } /// /// 字符串转Int /// /// /// private int ParseToInt(string str) { int returnInt = 0; if (str == null || str.Trim().Length < 1) { return returnInt; } if (int.TryParse(str, out returnInt)) { return returnInt; } else { return 0; } } } }