You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在.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。

修改步骤:

  1. 创建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()
);
  1. 确保所有工作表生效
    由于你的代码中worksheetPart1和worksheetPart2分别关联了多个Sheet,上述修改会让所有关联这两个WorksheetPart的工作表都启用RTL布局。

如果是已创建好的Worksheet,也可以通过以下方式追加配置:

SheetViews sheetViews = new SheetViews(new SheetView { RightToLeft = true });
worksheetPart.Worksheet.InsertAt(sheetViews, 0);

这样生成的Excel工作表就会默认以从右到左的布局显示。

内容的提问来源于stack exchange,提问作者ari23yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:54:55