using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Collections; using System.Reflection; using System.Windows.Forms; using xiaoy.Excel; using WinForm_Test; using System.IO; namespace SOH.Common { public class ExcelDC { public DataTable GetDgvToTable(DataGridView dgv) { DataTable dt = new DataTable(); for (int count = 0; count < dgv.Columns.Count; count++) { if (dgv.Columns[count].Visible == true) { DataColumn dc = new DataColumn(dgv.Columns[count].HeaderText.ToString()); dt.Columns.Add(dc); } } DataRow dr = dt.NewRow(); for (int i = 0; i < dgv.Rows.Count; i++) { for (int c = 0; c < dgv.Columns.Count; c++) { if (dgv.Columns[c].Visible == true) { for (int n = 0; n < dt.Columns.Count; n++) { if (dgv.Columns[c].HeaderText == dr.Table.Columns[n].ColumnName) { dr[n] = dgv.Rows[i].Cells[c].Value == null ? "" : dgv.Rows[i].Cells[c].Value.ToString(); } } } } dt.Rows.Add(dr.ItemArray); } return dt; } public void ExportExcel(string fileName, DataGridView dgv) { DataTable myDGV = GetDgvToTable(dgv); //string res = ""; if (myDGV.Rows.Count > 0) { string saveFileName = ""; //bool fileSaved = false; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel文件|*.xls"; saveDialog.FileName = fileName; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) { return; //被点了取消 } frmWaitingBox f = new frmWaitingBox((obj, args) => { ExcelFile.SetData(myDGV, saveFileName, ExcelVersion.Excel8, HDRType.Yes); MessageBox.Show("导出成功!"); }, 100000, "请等待...", false, false); f.ShowDialog(); } } /// /// datatable导出excel /// 2023-09-27 xulu 添加方法 /// /// /// public void ExportExcel(string fileName, DataTable dgv) { if (dgv.Rows.Count > 0) { string saveFileName = ""; //bool fileSaved = false; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel文件|*.xls"; saveDialog.FileName = fileName; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) { return; //被点了取消 } frmWaitingBox f = new frmWaitingBox((obj, args) => { //数据源为空 if (dgv == null) { throw new Exception("无数据可导"); } //保存路径为空 if (string.IsNullOrEmpty(saveFileName)) { throw new Exception("未设置Excel保存路径"); } //删除文件 if (File.Exists(saveFileName)) { File.Delete(saveFileName); } DataTableToExcel(dgv, saveFileName); MessageBox.Show("导出成功!"); }, 100000, "请等待...", false, false); f.ShowDialog(); } } /// /// datatable转excel(主要解决字段长度不够的报错问题) /// 2023-09-27 xulu 添加方法 /// /// /// /// private static bool DataTableToExcel(DataTable dt, string filePath) { try { string bufferLine = ""; StreamWriter swObj = new StreamWriter(filePath, false, System.Text.Encoding.UTF8); string strLine=""; for (int i = 0; i < dt.Columns.Count; i++) { strLine = strLine + dt.Columns[i].Caption.ToString() + ","; //写列标题 } swObj.WriteLine(strLine); for (int i = 0; i < dt.Rows.Count; i++) { bufferLine = ""; for (int j = 0; j < dt.Columns.Count; j++) { if (j > 0) { bufferLine += ","; } String handleStr = dt.Rows[i][j].ToString(); //特殊符号转义,回车、换行 if (dt.Rows[i][j].ToString().Contains("\r\n")) { handleStr = dt.Rows[i][j].ToString().Replace("\r\n", ";"); } if (dt.Rows[i][j].ToString().Contains("\n") || dt.Rows[i][j].ToString().Contains("\r")) { handleStr = dt.Rows[i][j].ToString().Replace("\n", "").Replace("\r", ""); } //特殊符号转义,逗号 if (dt.Rows[i][j].ToString().Contains(",")) { //双引号 if (dt.Rows[i][j].ToString().Contains("\"")) { handleStr = dt.Rows[i][j].ToString().Replace("\"", "\"\""); } //逗号转义 handleStr = "\"" + handleStr + "\""; } bufferLine += handleStr; } swObj.WriteLine(bufferLine); } swObj.Close(); return true; } catch { return false; } } } }