C#--删除Excel的列
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; } } }