Excel 시트에서 점유된 셀의 범위를 가져오는 방법
저는 C#을 사용하여 엑셀 파일을 자동화합니다.저는 워크북과 그 안에 들어 있는 시트를 가져올 수 있었습니다.예를 들어 시트1에 2개의 콜과 5개의 행이 있다고 가정합니다.저는 점유된 셀의 범위를 A1:B5로 얻고 싶었습니다.다음 코드를 시도해 보았지만 정확한 결과가 나오지 않았습니다.#열과 #행은 훨씬 더 컸고 셀도 비어 있었습니다.
Excel.Range xlRange = excelWorksheet.UsedRange;
int col = xlRange.Columns.Count;
int row = xlRange.Rows.Count;
제가 그 범위를 얻기 위해 사용할 수 있는 다른 방법이 있나요?
저도 당신과 매우 비슷한 문제가 있었습니다.실제로 효과가 있었던 것은 다음과 같습니다.
iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;
//These two lines do the magic.
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();
iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;
IMHO에서 발생하는 일은 엑셀에서 데이터를 삭제할 때, 셀이 비어 있더라도 셀에 데이터가 있다고 계속 생각하는 것입니다.포맷을 지우면 빈 셀이 제거되어 실제 카운트가 반환됩니다.
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
이제 "range"가 점유된 셀 범위가 됩니다.
범위를 참조하십시오.특수 셀 메서드입니다.예를 들어, 상수 값 또는 공식을 가진 셀을 가져오려면 다음을 사용합니다.
_xlWorksheet.UsedRange.SpecialCells(
Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants |
Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)
모든 시나리오(보호 시트 제외)에서 작동할 수 있는 유일한 방법(Farham's Answer 기준):
다음을 지원합니다.
숨겨진 행/열 검색
데이터/공식이 없는 포맷된 셀을 무시합니다.
코드:
// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();
// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
InteropExcel.XlFindLookIn.xlValues,
InteropExcel.XlLookAt.xlWhole,
InteropExcel.XlSearchOrder.xlByRows,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Row;
// Detect Last Used Column - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
InteropExcel.XlSearchOrder.xlByColumns,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Column;
// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;
dim lastRow as long 'in VBA it's a long
lastrow = wks.range("A65000").end(xlup).row
지금은 좀 오래된 질문이지만, 누군가가 해결책을 찾고 있다면 이것은 저에게 효과가 있습니다.
using Excel = Microsoft.Office.Interop.Excel;
Excel.ApplicationClass excel = new Excel.ApplicationClass();
Excel.Application app = excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);
이 두 대사는 제게 효과가 없었습니다.
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();
시트에서 ctrl+end를 누르고 선택한 셀을 확인하여 테스트할 수 있습니다.
처음 두 줄 뒤에 이 줄을 추가하면 모든 사례에서 문제가 해결되었습니다.
Excel.Range xlActiveRange = WorkSheet.UsedRange;
범위를 찾을 위치를 알고 있는 경우 현재 지역 속성을 사용해 보십시오.사용한 범위의 경계가 표시됩니다.
이것은 공식을 찾는 데 적합하지만 시작 셀을 테스트하는 방법을 변경하여 일반 내용으로 확장할 수 있어야 합니다.이 외의 단일 셀 범위를 처리해야 합니다.
public static Range GetUsedPartOfRange(this Range range)
{
Excel.Range beginCell = range.Cells[1, 1];
Excel.Range endCell = range.Cells[range.Rows.Count, range.Columns.Count];
if (!beginCell.HasFormula)
{
var beginCellRow = range.Find(
"*",
beginCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByRows,
XlSearchDirection.xlNext,
false);
var beginCellCol = range.Find(
"*",
beginCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByColumns,
XlSearchDirection.xlNext,
false);
if (null == beginCellRow || null == beginCellCol)
return null;
beginCell = range.Worksheet.Cells[beginCellRow.Row, beginCellCol.Column];
}
if (!endCell.HasFormula)
{
var endCellRow = range.Find(
"*",
endCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByRows,
XlSearchDirection.xlPrevious,
false);
var endCellCol = range.Find(
"*",
endCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByColumns,
XlSearchDirection.xlPrevious,
false);
if (null == endCellRow || null == endCellCol)
return null;
endCell = range.Worksheet.Cells[endCellRow.Row, endCellCol.Column];
}
if (null == endCell || null == beginCell)
return null;
Excel.Range finalRng = range.Worksheet.Range[beginCell, endCell];
return finalRng;
}
}
당신은 "삭제"를 눌러 박스 안의 데이터를 삭제해서는 안 됩니다. 문제는 엑셀이 여전히 박스를 "<- 아직 값이 있습니다. 당신은 박스를 오른쪽 클릭하고 삭제를 클릭해야 합니다.
언급URL : https://stackoverflow.com/questions/1284388/how-to-get-the-range-of-occupied-cells-in-excel-sheet
'programing' 카테고리의 다른 글
비정규(임의로 내포된) 리스트 평탄화 (0) | 2023.04.29 |
---|---|
관찰 가능한 컬렉션을 지울 때 항목이 없습니다.이전 항목 (0) | 2023.04.29 |
파일의 각 줄에 대해 egchmod 명령을 어떻게 실행합니까? (0) | 2023.04.29 |
Xcode에서 iOS 앱의 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.04.29 |
구독이 네임스페이스 'Microsoft'를 사용하도록 등록되지 않았습니다.데이터 팩토리' 오류 (0) | 2023.04.29 |