programing

복구된 레코드 : 처음부터 생성된 워크시트의 셀 정보입니다.

javamemo 2023. 4. 25. 21:47
반응형

복구된 레코드 : 처음부터 생성된 워크시트의 셀 정보입니다.

OpenXML에서 만든 스프레드시트를 열 때 오류가 발생합니다.오류는 다음과 같습니다.

Repaired Records: Cell information from /xl/worksheets/sheet.xml part
Repaired Records: Cell information from /xl/worksheets/sheet2.xml part
Repaired Records: Cell information from /xl/worksheets/sheet3.xml part

온라인에서 유일하게 도움이 되는 것은 이 문제를 일으키는 개별 셀을 여러 번 변경하는 알고리즘에 대한 논의뿐이었습니다.그런 다음 SpreadsheetDocument용 생성자와 셀 업데이트를 위한 세 가지 기능을 연결합니다(한 번 실행).

필요에 따라 추가 기능을 제공할 수 있지만, 아래 두 가지 중 어느 쪽에 문제가 있다고 생각합니다.

그나저나.

 GetWorksheetPartByName
 InsertCellInWorksheet
 GetCell

모두 의도한 대로 작동해야 합니다.

실제 프로그램입니다.

static void Main(string[] args)
    {
        //Full path for File
        const string newFile = "@C:\test.xlsx";

        //Constructor creates default worksheet called "mySheet"
        var spreadsheet = new XLSXHelper(newFile);

        //updating some cells.
        spreadsheet.UpdateCell("mySheet", "D2", "R", 2);
    }

생성자입니다.

    public XLSXHelper(string filepath)
    {
        newFile = filepath;
        spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
        this.workbookPart = spreadsheetDocument.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();
        this.worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());
        Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
        AppendChild<Sheets>(new Sheets());
        Sheet sheet = new Sheet()
        {
            Id = spreadsheetDocument.WorkbookPart.
                GetIdOfPart(worksheetPart),
            SheetId = 1,
            Name = "mySheet"
        };
        sheets.Append(sheet);
        workbookPart.Workbook.Save();
        spreadsheetDocument.Close();
    }

셀을 업데이트합니다.

    public void UpdateCell(string worksheetName, string textToInsert, string columnName, uint rowIndex)
    {
        using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(newFile, true))
        {
            WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName);
            if (worksheetPart != null)
            {
                InsertCellInWorksheet(columnName, rowIndex, worksheetPart);
                Cell cell = GetCell(worksheetPart.Worksheet,columnName, rowIndex);
                cell.CellValue = new CellValue(textToInsert);
                worksheetPart.Worksheet.Save();
            }
        }
    }

숫자(또는 숫자로 변환할 수 있는 문자열)가 아닌 셀에 문자열을 추가하는 경우 CellValue 대신 인라인 문자열 또는 공유 문자열을 사용해야 합니다.값이 숫자인 경우에만 CellValue를 사용할 수 있습니다.

CellValue를 사용할 때 생성되는 XML은 다음과 같습니다.

<x:row>
  <x:c>
    <x:v>12345</x:v>
  </x:c>
</x:row>

인라인 문자열을 사용하면 다음과 같습니다.

<x:row>
  <x:c t="inlineStr">
    <x:is>
      <x:t>Foo</x:t>
    </x:is>
  </x:c>
</x:row>

인라인 문자열의 "is" 노드와 셀 유형 속성이 "inlineStr"로 설정되어 있습니다.

다음은 텍스트를 포함하는 셀에 대해 올바른 XML을 생성하는 C# 코드입니다.

cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };

제가 읽은 바로는 공유 스트링을 사용하는 것이 좋지만 인라인 스트링을 사용하는 것이 오류를 방지하고 Excel에서 파일을 열었을 때 괜찮아 보입니다.

문제는 워크시트 이름을 슬래시 앞에 슬래시가 있는 이름으로 설정해당 워크시트 이름은 슬래시 기호로 되어 있습니다./그 안에 있어요.

또 다른 늦었지만 행에 셀을 추가하는 방법을 확인하십시오.행의 기존 셀 참조(A1 등)와 비교하여 '단순'한 셀 코드를 잘라 붙여 넣었습니까?이 경우 Z 열 뒤에 셀이 있는 경우(AA1 이후) 셀 B1 앞에 셀(예: AB1)을 삽입하려고 할 수 있습니다.그러면 엑셀로 작성된 시트를 열면 이 오류가 발생합니다.대신, 각 행을 따라 셀을 하나씩 추가하는 경우, 참조 셀을 null로 설정한 상태에서 앞에 삽입하기 위해 직진하십시오. 즉, 끝에 새 셀을 추가합니다.

그게 말이 됐으면 좋겠어요.

문제는 내 애플리케이션에 내보내기 모듈이 있고 한 환경에서 내보낸 파일은 정상적으로 작동했지만 다른 환경에서는 작동하지 않았다는 것입니다.동일한 오류입니다.

Repaired Records: Cell information from /xl/worksheets/sheet19.xml part

자세히 조사한 결과, 본 시트의 기록 중 셀 제한치인 32767자를 초과하여 DB의 텍스트 크기를 직접 줄임으로써 문제가 해결되었다는 것을 알게 되었습니다.

저 같은 경우에는 데이터 유형을 날짜로 설정하려고 했습니다.MSDN 날짜는 Office2010에서만 사용할 수 있습니다. 그래서 다시 문자열로 변경했고 오류는 사라졌습니다.

저는 바뀌었습니다:

cell.DataType = CellValues.Date;

다음을 참조하십시오.

cell.DataType = CellValues.String;

제 경우에는 파일을 복구할 수 없다는 점이 달랐습니다.

문제는 행색인이었고, 행색인은 제가 전달했습니다.InsertCellInWorksheet MSDN의 예에서 가져온 것입니다.

Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart);

행을 삽입할 때 행의 색인이 0이 아니라 1인지 확인하십시오.그런데이 경우 0은 0이고, 이 경우 0은 0입니다.SheetData네, 그렇습니다.

sheetData.InsertAt(new Row() { RowIndex = 1 }, 0);
lastRow = sheetData.Elements<Row>().LastOrDefault();

흥미롭게도, 통합 테스트는 통과했지만, Excel을 통해 파일을 열었을 때 오류에 대한 팝업이 표시되었습니다.그러나 엑셀로 파일을 열 수 없기 때문에 인덱스 0과 약간의 비밀성이 있는 것 같습니다.

제가 이 문제에 하게 된 은 워크북 오브젝트를 제대로 사용하지 않았기 입니다.FileOutputStream요.

Excel 파일을 열려고 할 때 "Excel에서 파일을 열 수 없습니다"라고 표시되면 파일이 손상되었음을 의미합니다(셀 값이 방해됨).저의 경우 코드에 적용한 스타일(보더)을 모두 제거했더니 오류 발생 없이 파일이 정상적으로 열립니다.

저 같은 경우에는 숫자가 있는 열이 있는데 이 열에 데이터를 채울 때 NaN으로 데이터를 얻으니 엑셀은 그 오류를 주세요.먼저 각 열에 필터를 설정하고 몇 가지 특별한 데이터에 주목하라고 조언합니다.

제 경우 SSRS 자리 표시자 속성에는 사용자 지정 번호가 있습니다.

수정:

  1. SSRS 디자이너의 모든 필드를 하나씩 이동합니다.
  2. 백엔드에서 오는 영숫자 값이 있는지 확인합니다.( 데이터 세트를 SSRS 보고서의 모든 셀과 교차 비교합니다.
  3. 필드를 두 번 클릭합니다. -> '번호' 탭으로 이동합니다.
  4. 기본 -> 확인을 클릭합니다.

고마워요 우마칸스 넬리게

제 경우엔, 어떤 세포들은 무한대의 이중값을 가지고 있습니다.Excel에서 읽을 수 없는 콘텐츠 오류를 표시합니다.Open XML 생산성 도구는 오류를 감지하지 못하기 때문에 원인을 찾기 어려울 수 있습니다.셀 값이 무한대일 가능성이 있는 경우 cellValue를 할당하기 전에 값을 문자열로 변환해야 합니다.

같은 문제가 있었습니다. 값이 공유 문자열로 저장되는 경우 공유 문자열 테이블에 새 ID(인덱스)를 만들어야 합니다.

InsertSharedStringItem 함수의 구현은 다음과 같습니다. https://learn.microsoft.com/en-us/office/open-xml/working-with-the-shared-string-table.

InsertCellInWorksheet에 대한 구현은 https://learn.microsoft.com/en-us/office/open-xml/how-to-insert-text-into-a-cell-in-a-spreadsheet#sample-code에서 확인할 수 있습니다.

이것들은 샘플 기능들이니 필요에 따라 업데이트 하세요.

var sstid = InsertSharedStringItem(textToInsert, sharedStringTable);
Cell cell = InsertCellInWorksheet(columnName, rowIndex, worksheetPart);
cell.CellValue = new CellValue($"{sstid}");
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
worksheetPart.Worksheet.Save();

제 경우엔 십진수 연속화였죠우리는 십진 쉼표 "를 사용하지만, Excel 파일의 xml에서는 현재 문화 정보에 관계없이 항상 US(따라서 "")를 사용합니다.

해결책은 적어도 이 문제를 해결하는 2.13.001-베타 패키지를 사용하는 것입니다.

Dinisha Surisetty와 비슷한 문제가 있었습니다.내 셀에 대한 StyleIndex를 제거하면 경고 없이 Excel이 열립니다.셀을 만들기 위한 작업 코드를 공유합니다.

private Cell CreateCell(string text)
{
    Cell cell = new Cell();
    // cell.StyleIndex = 1U;  //After commenting this line, It worked.
    cell.DataType = ResolveCellDataTypeOnValue(text);
    if (cell.DataType == CellValues.Number)
    {
        cell.CellValue = new CellValue(text);
    }
    else
    {
        cell.InlineString = new InlineString() { Text = new Text(text) };
    }
    return cell;
}

아마 이미 해결되었을 것입니다만, 똑같은 오류가 발생했기 때문에 제 솔루션을 추가합니다.

내 오류:

Repaired Part: /xl/worksheets/sheet1.xml part with XML error. HRESULT 0x8000ffff Line 1, column 0

DataValidation에서 문제가 발생했는데, 일부 조건에서는 데이터 검증을 연속해서 추가합니다.특정 경우 데이터 검증을 설정하고 빈 데이터 검증을 추가했습니다.이로 인해 해당 오류도 발생합니다.

따라서 아래 코드(예제)에서는 'addFormulaToRow3'이 거짓이며 이로 인해 빈 dataValidations 개체가 추가되었습니다.

DataValidations dataValidations = new DataValidations();
bool anyCreated = false; // set to true if any validations are added to dataValidations

...
if(addFormulaToRow3)
{
    ...
    anyCreated = true; // set to true as we adding validations
    dataValidation.Append(formula);
    dataValidations.Append(dataValidation);

}

...

if (anyCreated)
{
    mySheetPart.Worksheet.AppendChild(dataValidations);
}

언급URL : https://stackoverflow.com/questions/9401508/repaired-records-cell-information-from-worksheet-created-from-scratch 입니다.

반응형