using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; using System.Data; using System.Drawing; using System.Collections; using System.Diagnostics; using System.Data.OleDb; namespace LingDang.CRM.UI.Client { public class ExcelIO : IDisposable { #region Constructors private ExcelIO() { status = IsExistExecl() ? 0 : -1; } public static ExcelIO GetInstance() { //if(instance == null) //{ // lock (syncRoot) // { // if(instance == null) // { // instance = new ExcelIO(); // } // } //} //return instance; return new ExcelIO(); } #endregion #region Fields private static ExcelIO instance; private static readonly object syncRoot = new object(); private string returnMessage; private Excel.Application xlApp; private Excel.Workbooks workbooks = null; private Excel.Workbook workbook = null; private Excel.Worksheet worksheet = null; private Excel.Range range = null; private int status = -1; private bool disposed = false;//是否已经释放资源的标记 #endregion #region Properties /// <summary> /// 返回信息 /// </summary> public string ReturnMessage { get { return returnMessage; } } /// <summary> /// 状态:0-正常,-1-失败 1-成功 /// </summary> public int Status { get { return status; } } #endregion #region Methods /// <summary> /// 判断是否安装Excel /// </summary> /// <returns></returns> protected bool IsExistExecl() { try { xlApp = new Excel.Application(); if (xlApp == null) { returnMessage = "无法创建Excel对象,可能您的计算机未安装Excel!"; return false; } } catch (Exception ex) { returnMessage = "请正确安装Excel!"; //throw ex; return false; } return true; } /// <summary> /// 获得保存路径 /// </summary> /// <returns></returns> public static string SaveFileDialog() { SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "xls"; sfd.Filter = "Excel文件(*.xls)|*.xls"; if (sfd.ShowDialog() == DialogResult.OK) { return sfd.FileName; } return string.Empty; } /// <summary> /// 获得打开文件的路径 /// </summary> /// <returns></returns> public static string OpenFileDialog() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "xls"; ofd.Filter = "Excel文件(*.xls)|*.xls"; if (ofd.ShowDialog() == DialogResult.OK) { return ofd.FileName; } return string.Empty; } /// <summary> /// 设置单元格边框 /// </summary> protected void SetCellsBorderAround() { range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null); //if (dt.Rows.Count > 0) //{ // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic; // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous; // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin; //} //if (dt.Columns.Count > 1) { range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic; range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous; range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin; } } /// <summary> /// 将DataTable导出Excel /// </summary> /// <param name="dt">数据集</param> /// <param name="saveFilePath">保存路径</param> /// <param name="reportName">报表名称</param> /// <returns>是否成功</returns> public bool DataTableToExecl(DataTable dt, string saveFileName, string reportName) { //判断是否安装Excel bool fileSaved = false; if (status == -1) return fileSaved; //判断数据集是否为null if (dt == null) { returnMessage = "无引出数据!"; return false; } //判断保存路径是否有效 if (!saveFileName.Contains(":")) { returnMessage = "引出路径有误!请选择正确路径!"; return false; } //创建excel对象 workbooks = xlApp.Workbooks; workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 worksheet.Cells.Font.Size = 10; worksheet.Cells.NumberFormat = "@"; long totalCount = dt.Rows.Count; long rowRead = 0; float percent = 0; int rowIndex = 0; //第一行为报表名称,如果为null则不保存该行 ++rowIndex; worksheet.Cells[rowIndex, 1] = reportName; range = (Excel.Range)worksheet.Cells[rowIndex, 1]; range.Font.Bold = true; //写入字段(标题) ++rowIndex; for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[rowIndex, i + 1] = dt.Columns[i].ColumnName; range = (Excel.Range)worksheet.Cells[rowIndex, i + 1]; range.Font.Color = ColorTranslator.ToOle(Color.Blue); range.Interior.Color = dt.Columns[i].Caption == "表体" ? ColorTranslator.ToOle(Color.SkyBlue) : ColorTranslator.ToOle(Color.Yellow); } //写入数据 ++rowIndex; for (int r = 0; r < dt.Rows.Count; r++) { for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[r + rowIndex, i + 1] = dt.Rows[r][i].ToString(); } rowRead++; percent = ((float)(100 * rowRead)) / totalCount; } //画单元格边框 range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[dt.Rows.Count + 2, dt.Columns.Count]); this.SetCellsBorderAround(); //列宽自适应 range.EntireColumn.AutoFit(); //保存文件 if (saveFileName != "") { try { workbook.Saved = true; workbook.SaveCopyAs(saveFileName); fileSaved = true; } catch (Exception ex) { fileSaved = false; returnMessage = "导出文件时出错,文件可能正被打开!\n" + ex.Message; } } else { fileSaved = false; } //释放Excel对应的对象(除xlApp,因为创建xlApp很花时间,所以等析构时才删除) //Dispose(false); Dispose(); return fileSaved; } /// <summary> /// 导入EXCEL到DataSet /// </summary> /// <param name="fileName">Excel全路径文件名</param> /// <returns>导入成功的DataSet</returns> public DataSet ImportExcel(string fileName) { if (status == -1) return null; //判断文件是否被其他进程使用 try { workbook = xlApp.Workbooks.Open(fileName, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, 1, 0); worksheet = (Excel.Worksheet)workbook.Worksheets[1]; } catch { returnMessage = "Excel文件处于打开状态,请保存关闭"; return null; } //获得所有Sheet名称 int n = workbook.Worksheets.Count; string[] sheetSet = new string[n]; ArrayList al = new ArrayList(); for (int i = 0; i < n; i++) { sheetSet[i] = ((Excel.Worksheet)workbook.Worksheets[i + 1]).Name; } //释放Excel相关对象 Dispose(); //把EXCEL导入到DataSet DataSet ds = null; //string connStr = " Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + fileName + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1;\""; List<string> connStrs = new List<string>(); connStrs.Add("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileName + ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1;\""); connStrs.Add("Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + fileName + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1;\""); foreach (string connStr in connStrs) { ds = GetDataSet(connStr, sheetSet); if (ds != null) break; } return ds; } /// <summary> /// 通过olddb获得dataset /// </summary> /// <param name="connectionstring"></param> /// <returns></returns> protected DataSet GetDataSet(string connStr, string[] sheetSet) { DataSet ds = null; using (OleDbConnection conn = new OleDbConnection(connStr)) { try { conn.Open(); OleDbDataAdapter da; ds = new DataSet(); for (int i = 0; i < sheetSet.Length; i++) { string sql = "select * from [" + sheetSet[i] + "$] "; da = new OleDbDataAdapter(sql, conn); da.Fill(ds, sheetSet[i]); da.Dispose(); } conn.Close(); conn.Dispose(); } catch (Exception ex) { return null; } } return ds; } /// <summary> /// 释放Excel对应的对象资源 /// </summary> /// <param name="isDisposeAll"></param> protected virtual void Dispose(bool disposing) { try { if (!disposed) { if (disposing) { if (range != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(range); range = null; } if (worksheet != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); worksheet = null; } if (workbook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); workbook = null; } if (workbooks != null) { xlApp.Application.Workbooks.Close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); workbooks = null; } if (xlApp != null) { xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); } int generation = GC.GetGeneration(xlApp); System.GC.Collect(generation); } //非托管资源的释放 //KillExcel(); } disposed = true; } catch (Exception e) { throw e; } } /// <summary> /// 会自动释放非托管的该类实例的相关资源 /// </summary> public void Dispose() { try { Dispose(true); //告诉垃圾回收器,资源已经被回收 GC.SuppressFinalize(this); } catch (Exception e) { throw e; } } /// <summary> /// 关闭 /// </summary> public void Close() { try { this.Dispose(); } catch (Exception e) { throw e; } } /// <summary> /// 析构函数 /// </summary> ~ExcelIO() { try { Dispose(false); } catch (Exception e) { throw e; } } /// <summary> /// 关闭Execl进程(非托管资源使用) /// </summary> private void KillExcel() { try { Process[] ps = Process.GetProcesses(); foreach (Process p in ps) { if (p.ProcessName.ToLower().Equals("excel")) { //if (p.Id == ExcelID) { p.Kill(); } } } } catch (Exception ex) { //MessageBox.Show("ERROR " + ex.Message); } } #endregion #region Events #endregion #region IDisposable 成员 #endregion } }
时间: 2024-10-27 19:02:50