복구된 레코드 : 처음부터 생성된 워크시트의 셀 정보입니다.
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 자리 표시자 속성에는 사용자 지정 번호가 있습니다.
수정:
- SSRS 디자이너의 모든 필드를 하나씩 이동합니다.
- 백엔드에서 오는 영숫자 값이 있는지 확인합니다.( 데이터 세트를 SSRS 보고서의 모든 셀과 교차 비교합니다.
- 필드를 두 번 클릭합니다. -> '번호' 탭으로 이동합니다.
- 기본 -> 확인을 클릭합니다.
고마워요 우마칸스 넬리게
제 경우엔, 어떤 세포들은 무한대의 이중값을 가지고 있습니다.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 입니다.
'programing' 카테고리의 다른 글
R에서 벡터와 리스트 데이터 유형의 차이점은 무엇입니까? (0) | 2023.04.25 |
---|---|
T-SQL에서 현재 인스턴스 이름을 가져오는 방법입니다. (0) | 2023.04.25 |
명령줄에서 모든 환경 변수를 나열합니다. (0) | 2023.04.25 |
Excel 날짜를 yyymmd에서 mm/dd/yyyy로 변환합니다. (0) | 2023.04.25 |
C++의 문자열을 대문자로 변환합니다. (0) | 2023.04.25 |