求助:在.NET 8中用OpenXml设置Excel工作表为RTL的方法
在OpenXml中设置Excel工作表为从右到左(RTL)布局
我正在使用.NET 8结合OpenXml库创建Excel文件,文件生成功能正常,但无法将工作表设置为从右到左(RTL)布局。查阅OpenXml官方文档后仍未找到相关配置方法,特此求助如何设置工作表默认对齐为从右到左,以下是当前实现代码:
[HttpPost] [DisableRequestSizeLimit] public async Task<IActionResult> ValidationAndVerificationTaaminExcelFile(ValidationAndVerificationTaaminExcelFileDto request) { try { string fileAddress = @"D:\Excel\Output.xlsx"; if (System.IO.File.Exists(fileAddress)) { System.IO.File.Delete(fileAddress); } using (SpreadsheetDocument doc = SpreadsheetDocument.Create(fileAddress, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = doc.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart1 = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart1.Worksheet = new Worksheet(new SheetData()); WorksheetPart worksheetPart2 = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart2.Worksheet = new Worksheet(new SheetData()); Sheets sheets = doc.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet1 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart2), SheetId = 1, Name = "ویزیت شد" }; Sheet sheet2 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart2), SheetId = 2, Name = "ویزیت موفق" }; Sheet sheet3 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart2), SheetId = 3, Name = "mldhsp65" }; Sheet sheet4 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart1), SheetId = 4, Name = "Darman" }; Sheet sheet5 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart1), SheetId = 5, Name = "ارسال نشده" }; Sheet sheet6 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart1), SheetId = 6, Name = "شبیه سازی شده" }; Sheet sheet7 = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(worksheetPart1), SheetId = 7, Name = "در دیتابیس هست در سازمان نیست" }; sheets.Append(sheet1, sheet2, sheet3, sheet4, sheet5, sheet6, sheet7); string[,] sheet1Content = new string[,] { { "Name", "Age", "Country" }, { "John", "30", "USA" }, { "Alice", "25", "UK" }, { "Bob", "35", "Canada" } }; AddContentToWorksheet(doc, worksheetPart2, sheet1Content); // Add content to sheet2 and sheet3 string[,] sheet2Content = new string[,] { { "Name", "Age", "Country" }, { "John", "30", "USA" }, { "Alice", "25", "UK" }, { "Bob", "35", "Canada" } }; AddContentToWorksheet(doc, worksheetPart2, sheet2Content); string[,] sheet3Content = new string[,] { { "Name", "Age", "Country" }, { "David", "40", "Australia" }, { "Emma", "28", "Germany" }, { "Jack", "32", "France" } }; AddContentToWorksheet(doc, worksheetPart2, sheet3Content); workbookPart.Workbook.Save(); } DateTime convertedDate = UtilityMananger.PersianToGeorgian(request.Date); var IsExist = await _taaminService.CheckForDuplicateRecordByDate(request.ExcelType, convertedDate); if (IsExist) { return Ok(new ResponseDto<List<TaminResult>> { IsSuccessFull = false, Data = null, Message = ErrorsMessages.SubmitedBefore, Status = "Failed" }); } var result = await _taaminService.ValidateExcelFile(request.Date, request.ExcelType); return Ok(new ResponseDto<ValidationAndVerificationExcelResponseDto> { IsSuccessFull = true, Data = result, Message = ErrorsMessages.Success, Status = "Success" }); } catch (Exception ex) { // TODO LOG return StatusCode(StatusCodes.Status500InternalServerError, new ResponseDto<bool> { IsSuccessFull = false, Message = ErrorsMessages.InternalError500, Status = "Failed" }); } } private static void AddContentToWorksheet(SpreadsheetDocument doc, WorksheetPart worksheetPart, string[,] content) { SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); for (int row = 0; row < content.GetLength(0); row++) { Row newRow = new Row(); for (int col = 0; col < content.GetLength(1); col++) { Cell cell = new Cell(); cell.DataType = CellValues.String; cell.CellValue = new CellValue(content[row, col]); newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } }
解决方案
要为工作表启用从右到左(RTL)布局,需在Worksheet节点中添加SheetViews配置,并将SheetView的RightToLeft属性设为true。
修改步骤:
- 创建Worksheet时添加RTL配置
将原代码中创建Worksheet的部分,从仅传入SheetData改为包含SheetViews:
// 修改worksheetPart1的创建 WorksheetPart worksheetPart1 = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart1.Worksheet = new Worksheet( new SheetViews(new SheetView { RightToLeft = true }), new SheetData() ); // 修改worksheetPart2的创建 WorksheetPart worksheetPart2 = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart2.Worksheet = new Worksheet( new SheetViews(new SheetView { RightToLeft = true }), new SheetData() );
- 确保所有工作表生效
由于你的代码中worksheetPart1和worksheetPart2分别关联了多个Sheet,上述修改会让所有关联这两个WorksheetPart的工作表都启用RTL布局。
如果是已创建好的Worksheet,也可以通过以下方式追加配置:
SheetViews sheetViews = new SheetViews(new SheetView { RightToLeft = true }); worksheetPart.Worksheet.InsertAt(sheetViews, 0);
这样生成的Excel工作表就会默认以从右到左的布局显示。
内容的提问来源于stack exchange,提问作者ari23yan
相关产品推荐
相关产品推荐

