programing

자동 필터를 추가하고 정렬하면 Excel이 충돌합니다.

muds 2023. 9. 8. 21:48
반응형

자동 필터를 추가하고 정렬하면 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. 이름 바꾸기.xlsxExcel에서 시작합니다.편집을 활성화하고 열 중 하나를 선택한 후 정렬을 시도합니다.

편집: 이것을 좀 더 가지고 노는 것.파일을 엑셀에 다시 저장하면 아직 고장난 상태입니다.그러나 필터를 먼저 적용한 후 지우기를 한 후 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

반응형