尝试使用c#排列excel范围的两列

我有一个在Excel中的范围,我需要按两列分类。 数据将始终从列A到列AA,我需要首先按列A(这是一个date列,从最老到最新),然后列F(数字列,从最小到最高)sorting。 行数会有所不同。

这是我到目前为止,请记住我相对较新的C#。

Excel.Worksheet JobDataSheet = new Excel.Worksheet(); foreach (Excel.Worksheet tmpSheet in Globals.ThisAddIn.Application.ActiveWorkbook.Sheets) { if (tmpSheet.Name == "Job Labour" || tmpSheet.Name == "Job Materials" || tmpSheet.Name == "Job Cost Report") { tmpSheet.Delete(); } if (tmpSheet.Name == "Job Cost") JobDataSheet = tmpSheet; } int MyCount = JobDataSheet.UsedRange.Rows.Count; //Sort Collection by Date & Ref Line Excel.Range tempRange = JobDataSheet.get_Range("A2:A" + MyCount); Excel.Range tempRange2 = JobDataSheet.get_Range("F2:F" + MyCount); JobDataSheet.Sort.SortFields.Clear(); JobDataSheet.Sort.SortFields.Add(tempRange // First Key ,Excel.XlSortOn.xlSortOnValues ,Excel.XlSortOrder.xlAscending ,Type.Missing ,Excel.XlSortDataOption.xlSortNormal); JobDataSheet.Sort.SortFields.Add(tempRange2 // Second Key , Excel.XlSortOn.xlSortOnValues , Excel.XlSortOrder.xlAscending , Type.Missing , Excel.XlSortDataOption.xlSortNormal); JobDataSheet.Sort.SetRange(JobDataSheet.get_Range("A1:AA" + MyCount)); JobDataSheet.Sort.Header = Excel.XlYesNoGuess.xlYes; JobDataSheet.Sort.MatchCase = false; JobDataSheet.Sort.Orientation = Excel.XlSortOrientation.xlSortRows; JobDataSheet.Sort.SortMethod = Excel.XlSortMethod.xlPinYin; JobDataSheet.Sort.Apply(); 

JobDataSheet.Sort.Apply(); line excel throws "The sort reference is not valid. Make sure that it's within the data you want to sort, and the first Sort By box isn't in the same or blank."

这对我有用:

 private void SortExcel() { //Set up Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet oSheet; Excel.Range oRng; Excel.Range oLastAACell; Excel.Range oFirstACell; //Start Excel and get Application object. oXL = new Excel.Application(); oXL.Visible = true; //Get a new workbook.; oWB = (Excel._Workbook)(oXL.Workbooks.Open(@"C:\Book.Xlsx")); //Get Sheet Object oSheet = (Excel.Worksheet)oWB.Worksheets["Sheet1"]; //Get complete last Row in Sheet (Not last used just last) int intRows = oSheet.Rows.Count; //Get the last cell in Column AA oLastAACell = (Excel.Range)oSheet.Cells[intRows, 27]; //Move courser up to the last cell in AA that is not blank oLastAACell = oLastAACell.End[Excel.XlDirection.xlUp]; //Get First Cell of Data (A2) oFirstACell = (Excel.Range)oSheet.Cells[2, 1]; //Get Entire Range of Data oRng = (Excel.Range)oSheet.Range[oFirstACell, oLastAACell]; //Sort the range based on First Columns And 6th (in this case A and F) oRng.Sort(oRng.Columns[1, Type.Missing],Excel.XlSortOrder.xlAscending, // the first sort key Column 1 for Range oRng.Columns[6, Type.Missing],Type.Missing, Excel.XlSortOrder.xlAscending,// second sort key Column 6 of the range Type.Missing, Excel.XlSortOrder.xlAscending, // third sort key nothing, but it wants one Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal); }