1,添加引用Microsoft.Office.Interop.Excel.dll
2, using MSExcel = Microsoft.Office.Interop.Excel;
3,應用案例
/// <summary> /// 打開atlas的另存數據,刪除不需要顯示的數據 /// </summary> /// <param name="filePath">atlas另存數據</param> public static void Step5(FilePath filePath) { //【1】打開excel文件的第幾張表,第幾行的數據,返回一個字典{列名:列的索引} //字典的作用:可以根據列名快速找到對應的列索引 Dictionary<string, int> dicData = ExcelHelper.GetDataDictionary(filePath.AtlasDataBackUpFileName, 1, 1); Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); MSExcel.Workbook workbook = excel.Application.Workbooks.Open(filePath.AtlasDataBackUpFileName); MSExcel.Worksheet worksheet = workbook.Worksheets[1]; try { //刪除不需要的列 int deleteNumber = 0; foreach (string columnName in RemoveColumnNames.RemoveList) { ((MSExcel.Range)worksheet.Cells[System.Reflection.Missing.Value, dicData[columnName] + 1 - deleteNumber]).Select(); ((MSExcel.Range)worksheet.Cells[System.Reflection.Missing.Value, dicData[columnName] + 1 - deleteNumber]).EntireColumn.Delete(); deleteNumber++; } //給單元格賦值 worksheet.get_Range("B1", "B1").Value = "機型碼"; worksheet.get_Range("C1", "C1").Value = "作業員"; worksheet.get_Range("D1", "D1").Value = "工位"; //【注意】通過行列索引給單元格賦值,索引是從1開始的,不是從0開是的。下面設置從0開始的就報錯 //worksheet.Cells[0,1].Value = "測試"; //worksheet.Cells[1, 0].Value = "測試"; //設置Format屬性,保留1位小數。【設置所有的列,太費時間了,不建議用】 //worksheet.get_Range("G1", "G65535").NumberFormat = "0.0"; //worksheet.get_Range("H1", "H65535").NumberFormat = "0.0"; //獲取已用的范圍數據 int rowsCount = worksheet.UsedRange.Rows.Count; int colsCount = worksheet.UsedRange.Columns.Count; //設置Format屬性,保留1位小數 worksheet.get_Range("G2", "G"+ rowsCount).NumberFormat = "0.0"; worksheet.get_Range("H2", "H"+ rowsCount).NumberFormat = "0.0"; #region 設置打印頁按比例縮放,將所有列打印在一頁,都沒效果,建議直接用NPOI的打印縮放 //worksheet.PageSetup.Orientation = MSExcel.XlPageOrientation.xlPortrait; //打印時頁面設置,必須設置為false,下面的二行頁高,頁寬才有效 //worksheet.PageSetup.Zoom = false; //設置打印列寬為1頁 //worksheet.PageSetup.FitToPagesWide = 1;//【不穩定,有時候會把所有列設置為1頁】 //worksheet.PageSetup.FitToPagesTall = 0; //worksheet.PageSetup.CenterHorizontally = true; //worksheet.PageSetup.Zoom = false; //worksheet.PageSetup.Zoom = 75; //worksheet.PageSetup.Zoom = 75;//打印時頁面設置,縮放比例 //worksheet.PageSetup.TopMargin = 0; //上邊距為0 //worksheet.PageSetup.BottomMargin = 0; //下邊距為0 //worksheet.PageSetup.LeftMargin = 0; //左邊距為0 //worksheet.PageSetup.RightMargin = 0; //右邊距為0 #endregion workbook.Save(); } catch (Exception exception) { MessageBox.Show(exception.Message,"刪除列或設置值出錯"); } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); excel.Quit(); GC.Collect(); KeyMyExcelProcess.Kill(excel); } }
4,關閉Excel進程
/// <summary> /// 關閉Excel進程 /// </summary> public class KeyMyExcelProcess { [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); public static void Kill(Microsoft.Office.Interop.Excel.Application excel) { try { IntPtr t = new IntPtr(excel.Hwnd); //得到這個句柄,具體作用是得到這塊內存入口 int k = 0; GetWindowThreadProcessId(t, out k); //得到本進程唯一標志k System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到對進程k的引用 p.Kill(); //關閉進程k } catch (System.Exception ex) { throw ex; } } }