자동 필터를 추가하고 정렬하면 Excel이 충돌합니다.
OpenXML을 사용하여 엑셀 파일로 데이터를 내보낼 수 있는 어플리케이션을 개발 중입니다. 오토필터만 있으면 모든 것이 정상적으로 작동합니다.이 아이디어는 자동 필터를 데이터 본체에 추가하여 사용자가 자동으로 데이터를 필터링하고 정렬할 수 있는 컨트롤을 갖도록 하는 것입니다.그래서 코드상으로 저는 다음과 같은 일을 합니다.
var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
내보낸 XLSX에서는 다음과 같이 나타납니다.
<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />
그리고 그것은 그 사이의 워크시트에 추가됩니다.sheetData
그리고.mergeCells
.
그러면 엑셀로 이 필터를 열 수 있고 잘 작동합니다.열을 정렬하려고 하면 열이 정렬된 다음 Excel이 충돌합니다.파일을 저장하고 다시 로드한다고 해서(Excel이 모든 것을 정리하도록 강제함) 문제가 해결되지는 않습니다.그러나 필터를 먼저 적용하는 경우(열을 필터하는 경우)> 10
, 필터를 제거하면 충돌 없이 정렬할 수 있습니다.필터를 적용하고 제거한 후 파일을 저장했는데 이제는 파일도 괜찮지만 "수리된" 파일의 XML을 보면 뚜렷한 차이가 없습니다.
무엇이 문제를 일으킬지 아는 사람 있습니까?자동 필터를 적용할 때 워크시트에 추가하는 것 외에 제가 해야 할 일이 있나요?
참고: Excel 2010(버전 14.0.7153.5000)을 사용하고 있습니다.
다음은 예제 파일입니다(다운로드를 클릭하면 다운로드가 됩니다)..zip
. 이름 바꾸기.xlsx
Excel에서 시작합니다.편집을 활성화하고 열 중 하나를 선택한 후 정렬을 시도합니다.
편집: 이것을 좀 더 가지고 노는 것.파일을 엑셀에 다시 저장하면 아직 고장난 상태입니다.그러나 필터를 먼저 적용한 후 지우기를 한 후 Excel에 저장하면 작업 파일이 나타납니다.두 개의 파일(아직 복구되지 않은 재저장 파일과 현재 작업 중인 파일)을 자세히 살펴보니 필터가 적용된 후(그리고 삭제된 후) 워크북에 추가된 이 추가 비트가 눈에 띕니다.
<x:definedNames>
<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName>
</x:definedNames>
그게 뭔가가 될지 아닐지는...
좋아요, 그럼 여기 마법 공식은 다음과 같이DefinedNames
편집에서 제안한 부분:
<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName>
보아하니._xlmn._FilterDatabase
자동 필터가 작동하기 위해 필요합니다(최소한 정렬을 위해).필터링할 때 없으면 생성되지만 정렬할 때 없으면 엑셀이 터집니다.
따라서 시트명과 셀레퍼런스가 있어야 작성이 가능합니다.
표준을 , § 18.2.5의 18 § 18.2.5 § 18.2.에서, Open XML § 18.2.5에 나와 .definedName
, 다음과 같습니다.
필터 & 고급 필터
_xlnm.Criteria: 데이터 범위에 고급 필터를 적용할 때 사용할 기준 값을 포함하는 범위를 정의한 이름입니다.
_xlnm._FilterDatabase: 다음 중 하나일 수 있습니다.
a. 이 정의된 이름은 고급 필터가 적용된 범위를 나타냅니다.필터링되지 않은 원본 데이터 범위를 나타냅니다.
b. 이 정의된 이름은 AutoFilter가 적용된 범위를 나타냅니다.
그래서 당신은 당신이 추가할 필요가 있는 것 같습니다._xlnm._FilterDatabase
필터가 있는 모든 시트에 대해(단일 시트에 두 개 이상의 필터가 있을 수 없는 것으로 나타남).다입니다._xlmn_FilterDatabase
필터가 몇 장이든 상관없이 이름과 이름의 조합으로만 추측하기 때문입니다.localSheetId
독특해야 합니다.
그래서 결국엔, 이런 것이 있습니다.
var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}",
sheet.Name,
leftColumnLetter,
topRowIndex,
rightColumnLetter,
bottomRowIndex))
{
Name = "_xlnm._FilterDatabase",
LocalSheetId = sheet.SheetId - 1,
Hidden = true
});
이것은 엑셀의 버그에서 작동하는 것 같습니다.Excel은 정렬하기 전에 이름이 정의되어 있는지 확인하고 필요한 경우 자동으로 생성해야 합니다(정렬이 아닌 필터링을 하면 됩니다).
언급URL : https://stackoverflow.com/questions/33082375/adding-autofilter-and-sorting-causes-excel-to-crash
'programing' 카테고리의 다른 글
해시 테이블을 문자열 배열로 변환하는 중 (0) | 2023.09.08 |
---|---|
VbComponents.제거가 항상 모듈을 제거하는 것은 아닙니다. (0) | 2023.09.08 |
SQL 조건을 사용하여 두 테이블에서 데이터 가져오기 (0) | 2023.09.08 |
Jenkins Git 플러그인:특정 태그를 만드는 방법은? (0) | 2023.09.08 |
VBA TypeOf 연산자가 실패하는 이유 (0) | 2023.09.08 |