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;
}
}
}
