OpenXML에서 사용자 정의 열 너비 만들기(excel)
OpenXML(2.5 버전)을 처음 사용하는 사용자이며 행과 셀을 만들 수 있지만 열 너비를 설정할 수 있어야 하고 어떤 이유에서인지 올바르게 설정할 수 없습니다.
이 코드가 없는 경우:
Columns cols = new Columns();
Column c1 = new Column()
{
CustomWidth = true,
Width = 20
};
cols.Append(c1);
wspart.Worksheet.Append(cols);
프로그램이 실행되고 엑셀 파일이 생성됩니다.
아래 코드는 준수 및 실행되지만 손상된 엑셀 문서가 남아 있습니다.열을 추가하려고 할 때 무엇이 잘못되었습니까?
public static void createExcel() //TODO change to private
{
//create the spreadsheet document with openxml See https://msdn.microsoft.com/en-us/library/office/ff478153.aspx
SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Create(@"C:\Users\Reid\Documents\BLA\test.xlsx", SpreadsheetDocumentType.Workbook); //TODO change path
//add a workbook part
WorkbookPart wbpart = spreadsheetDoc.AddWorkbookPart();
wbpart.Workbook = new Workbook();
//add a worksheet part
WorksheetPart wspart = wbpart.AddNewPart<WorksheetPart>();
Worksheet ws = new Worksheet(new SheetData());
wspart.Worksheet = ws;
//create a new sheets array
Sheets sheets = spreadsheetDoc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
//create a new sheet
Sheet sheet = new Sheet()
{
Id = spreadsheetDoc.WorkbookPart.GetIdOfPart(wspart),
SheetId = 1,
Name = "mySheet" //TODO change name
};
//add the sheet to the workbook sheet aray
sheets.Append(sheet);
SheetData shData = wspart.Worksheet.GetFirstChild<SheetData>();
//////////////////////////////////row and col widths//////////////////////
Columns cols = new Columns();
Column c1 = new Column()
{
CustomWidth = true,
Width = 20
};
cols.Append(c1);
wspart.Worksheet.Append(cols);
//create the first row
Row r1 = new Row
{
RowIndex = 1,
CustomHeight = true,
Height = 71.25 //change height based on info
};
shData.Append(r1);
////////////////////////cell data/////////////////////////////////
// In the new row, find the column location to insert a cell in A1.
Cell refCell = null;
foreach (Cell cell in r1.Elements<Cell>())
{
if (string.Compare(cell.CellReference.Value, "A1", true) > 0)
{
refCell = cell;
break;
}
}
// Add the cell to the cell table at A1.
Cell newCell = new Cell() {
CellReference = "A1",
};
r1.InsertBefore(newCell, refCell);
// Set the cell value to be a numeric value of 100.
newCell.CellValue = new CellValue("100");
//TODO add in standard things (text that is always the same, headers, logos, etc.)
//TODO add in dynamic text
//TODO create and add in barcodes
//Save and close the document
wbpart.Workbook.Save();
spreadsheetDoc.Close();
//TODO send document to database
}
위에서 선택한 답변은 제 문제를 해결하지 못했지만, 저는 마침내 그것을 알아냈습니다.문제는 제가 전화를 걸었을 때였습니다.Columns columns1=worksheet1.GetFirstChild<Columns>();
현재는 없었습니다.Columns
워크시트의 하위 항목으로 반환된 개체가 null이고 열을 추가하려고 할 때 런타임 오류가 발생했습니다.Columns
물건.
문제는 엑셀이 까다롭다는 것입니다.실제 sheet.xml 파일의 열 요소는 sheetdata 요소보다 앞에 있어야 합니다.사용자 지정 열을 워크시트에 추가하려고 하면 열 요소가 시트 데이터 요소 뒤에 배치되어 파일이 손상되었습니다.시트 데이터 요소 이전이어야 한다는 것을 알았기 때문에 워크시트에 추가하지 않고 워크시트의 시작 부분에 삽입해야 했습니다.제게 도움이 된 코드는 다음과 같습니다.
// Save the stylesheet formats
stylesPart.Stylesheet.Save();
// Create custom widths for columns
Columns lstColumns = worksheetPart.Worksheet.GetFirstChild<Columns>();
Boolean needToInsertColumns = false;
if (lstColumns == null)
{
lstColumns = new Columns();
needToInsertColumns = true;
}
// Min = 1, Max = 1 ==> Apply this to column 1 (A)
// Min = 2, Max = 2 ==> Apply this to column 2 (B)
// Width = 25 ==> Set the width to 25
// CustomWidth = true ==> Tell Excel to use the custom width
lstColumns.Append(new Column() { Min = 1, Max = 1, Width = 25, CustomWidth = true });
lstColumns.Append(new Column() { Min = 2, Max = 2, Width = 9, CustomWidth = true });
lstColumns.Append(new Column() { Min = 3, Max = 3, Width = 9, CustomWidth = true });
lstColumns.Append(new Column() { Min = 4, Max = 4, Width = 9, CustomWidth = true });
lstColumns.Append(new Column() { Min = 5, Max = 5, Width = 13, CustomWidth = true });
lstColumns.Append(new Column() { Min = 6, Max = 6, Width = 17, CustomWidth = true });
lstColumns.Append(new Column() { Min = 7, Max = 7, Width = 12, CustomWidth = true });
// Only insert the columns if we had to create a new columns element
if (needToInsertColumns)
worksheetPart.Worksheet.InsertAt(lstColumns, 0);
// Get the sheetData cells
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
이것이 누군가에게 도움이 되기를 바랍니다!!
문제는 새 열 요소를 만들어 기존 워크시트 내용에 추가하는 것입니다.새 열을 기존 열 요소에 추가해야 합니다.
워크북을 만들고 저장한 다음 빈 열에 내용을 추가한 다음 워크북을 새 이름으로 저장하고 닫습니다.
Open XML SDK 2.5 Productivity Tool의 "Compare" 기능을 사용하여 차이가 포함된 워크시트 부분을 선택하고 선택한 다음 "View Package Code"를 클릭했습니다.원본 파일에서 새 열로 변경된 파일을 생성하는 코드는 다음과 같습니다.
Columns columns1=worksheet1.GetFirstChild<Columns>();
//other code here
Column column1 = new Column(){ Min = (UInt32Value)5U, Max = (UInt32Value)5U, Width = 16D, CustomWidth = true };
columns1.Append(column1);
새 열의 열 범위도 지정해야 합니다.
나는 같은 문제를 가지고 있었습니다..GetFirstChild<Columns>
null이었습니다.생성하기Columns
오브젝트와 인덱스 0에 삽입(다른 답변과 마찬가지로)은 Excel이 파일이 유효하지 않다고 불평하도록 만들었습니다.대신에, 그것은 열 정의가 바로 앞에 있기를 원하는 것처럼 보입니다.SheetData
섹션:
if (needToInsertColumns)
{
var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
worksheetPart.Worksheet.InsertBefore(columnsList, sheetData);
}
언급URL : https://stackoverflow.com/questions/34374785/creating-custom-column-widths-in-openxml-excel
'programing' 카테고리의 다른 글
SQL Server: 테이블 메타데이터 추출(설명, 필드 및 해당 데이터 유형) (0) | 2023.06.20 |
---|---|
Firebase CLI: "단일 페이지 앱으로 구성(모든 URL을 /index.html에 다시 쓰기)" (0) | 2023.06.20 |
범위의 행 수 결정 (0) | 2023.06.20 |
null 값을 고유 값으로 카운트 (0) | 2023.06.20 |
열거형 값을 반복 (0) | 2023.06.20 |