Embed the excel histogram into a word document as an ole object. The downloaded word document can freely edit the histogram data

 Workbook wb = new Workbook();
 int chartRows = 55;
 int chartCols = 25;

 String[] cellsName = new String[]
         {
                 "A1", "A2", "A3", "A4",
                 "B1", "B2", "B3", "B4",
                 "C1", "C2", "C3", "C4",
                 "D1", "D2", "D3", "D4",
                 "E1", "E2", "E3", "E4"
         };

 int[] cellsValue = new int[]
         {
                 67,86,68,91,
                 44,64,89,48,
                 46,97,78,60,
                 43,29,69,26,
                 24,40,38,25
         };
 int dataSheetIndex =wb.getWorksheets().add();
 Worksheet dataSheet =wb.getWorksheets().get(dataSheetIndex);
 String sheetName = "DataSheet";
 dataSheet.setName(sheetName);

 int size= Array.getLength(cellsName);
 for (int i = 0; i < size; i++)
 {
     String cellName = cellsName[i];
     int cellValue = cellsValue[i];
     dataSheet.getCells().get(cellName).setValue(cellValue);
 }

 int WorksheetIndex = wb.getWorksheets().add(SheetType.CHART);
 Worksheet chartSheet = wb.getWorksheets().get(WorksheetIndex);
 chartSheet.setName("ChartSheet");
 int chartSheetIdx = chartSheet.getIndex();

 int chIndex = chartSheet.getCharts().add(ChartType.COLUMN, 0, chartRows, 0, chartCols);
 var chart=chartSheet.getCharts().get(chIndex);

 chart.getNSeries().add(sheetName + "!A1:E1", false);
 chart.getNSeries().add(sheetName + "!A2:E2", false);
 chart.getNSeries().add(sheetName + "!A3:E3", false);
 chart.getNSeries().add(sheetName + "!A4:E4", false);

 wb.getWorksheets().setActiveSheetIndex(chartSheetIdx);

 wb.getWorksheets().setOleSize(0, chartRows, 0, chartCols);

 com.aspose.cells.ImageOrPrintOptions opts= new com.aspose.cells.ImageOrPrintOptions();
 opts.setImageFormat(com.aspose.cells.ImageFormat.getPng());
 ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
 wb.getWorksheets().get(chartSheetIdx).getCharts().get(0).toImage(imageStream, opts);

 ByteArrayOutputStream bout=new ByteArrayOutputStream();
 wb.save(bout,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);

 Shape oleObject = builder.insertOleObject(
         new ByteArrayInputStream(bout.toByteArray()),
         "Excel.Sheet",
         true,
         new ByteArrayInputStream(imageStream.toByteArray())
 );

 oleObject.setWidth(400);
 oleObject.setHeight(300);

 ByteArrayOutputStream wordStream = new ByteArrayOutputStream();
 doc.save(wordStream, SaveFormat.DOCX);

Through the above code, the exported word document has a histogram but cannot be edited. It should be that the insertOleObject method is used incorrectly. At present, I can only find cases of embedding excel charts into ppt on the official website. In order to achieve my needs, what part of my code needs to be adjusted?

@KeYee

To embed an Excel histogram into a Word document as an OLE object that can be freely edited, you need to ensure that you are using the correct method to insert the OLE object. Based on your provided code, it seems you are using the insertOleObject method correctly, but there are a few adjustments you can make to ensure the embedded object is editable.

Here’s a refined approach to your code:

  1. Ensure the OLE Object Type is Correct: When inserting the OLE object, make sure you specify the correct type for Excel. The type should be "Excel.Sheet" for Excel objects.

  2. Set the OLE Package Properties: After inserting the OLE object, you should set the properties of the OLE package to ensure it is recognized as an editable Excel object.

Here’s an updated version of your code snippet:

// Create a new workbook and add data
Workbook wb = new Workbook();
int chartRows = 55;
int chartCols = 25;

// Define cell names and values
String[] cellsName = { "A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4", "C1", "C2", "C3", "C4", "D1", "D2", "D3", "D4", "E1", "E2", "E3", "E4" };
int[] cellsValue = { 67, 86, 68, 91, 44, 64, 89, 48, 46, 97, 78, 60, 43, 29, 69, 26, 24, 40, 38, 25 };

// Add data to the worksheet
int dataSheetIndex = wb.getWorksheets().add();
Worksheet dataSheet = wb.getWorksheets().get(dataSheetIndex);
dataSheet.setName("DataSheet");
for (int i = 0; i < cellsName.length; i++) {
    dataSheet.getCells().get(cellsName[i]).setValue(cellsValue[i]);
}

// Create a chart
int chartSheetIndex = wb.getWorksheets().add(SheetType.CHART);
Worksheet chartSheet = wb.getWorksheets().get(chartSheetIndex);
chartSheet.setName("ChartSheet");
int chIndex = chartSheet.getCharts().add(ChartType.COLUMN, 0, chartRows, 0, chartCols);
Chart chart = chartSheet.getCharts().get(chIndex);
chart.getNSeries().add("DataSheet!A1:E1", false);
chart.getNSeries().add("DataSheet!A2:E2", false);
chart.getNSeries().add("DataSheet!A3:E3", false);
chart.getNSeries().add("DataSheet!A4:E4", false);

// Save the workbook to a stream
ByteArrayOutputStream bout = new ByteArrayOutputStream();
wb.save(bout, SaveFormat.EXCEL_97_TO_2003);

// Insert the OLE object into the Word document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Shape oleObject = builder.insertOleObject(new ByteArrayInputStream(bout.toByteArray()), "Excel.Sheet", true, null);
oleObject.setWidth(400);
oleObject.setHeight(300);

// Save the Word document
ByteArrayOutputStream wordStream = new ByteArrayOutputStream();
doc.save(wordStream, SaveFormat.DOCX);

Key Adjustments:

  • Ensure that the OLE object type is set to "Excel.Sheet" to allow for editing.
  • The insertOleObject method is used with the correct parameters to embed the Excel file.

By following these adjustments, the embedded histogram in the Word document should be editable as expected. If you continue to experience issues, please check the version of Aspose libraries you are using, as there may be updates or changes that affect functionality.

For more detailed guidance on embedding OLE objects, you can refer to the official documentation on embedding OLE objects in Word documents here and here.

Sources:
[1]: Embedding OLE Objects and ActiveX Controls in Word Documents
[2]: Insert Ole Object In Word With Ole Package

修改后的代码导出的word文档,柱形图部分消失了,变成了一个packager图标

@KeYee 请在 insertOleObject 中将 “Excel.Sheet” 更改为 “Excel.Sheet.8”

根据你的提示,目前我的实际代码如下:

	// 初始化 Aspose.Words 文档对象
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);

        for (Tuple3<String, String, List<CountInfo>> result : results) {
            Workbook workbook = new Workbook();
            Worksheet dataSheet =workbook.getWorksheets().get(0);
            dataSheet.setType(SheetType.WORKSHEET);
            dataSheet.setName(result.getT1());
            // 填充数据到 Excel 工作表
            dataSheet.getCells().get("A1").setValue("Category");
            dataSheet.getCells().get("B1").setValue("Count");

            // 将数据 填充到 Excel 表格
            int rowIndex = 2;
            for (CountInfo countData : result.getT3()) {
                dataSheet.getCells().get("A" + rowIndex).setValue(countData.getCategory());
                dataSheet.getCells().get("B" + rowIndex).setValue(countData.getCount());
                rowIndex++;
            }

            int WorksheetIndex = workbook.getWorksheets().add(SheetType.CHART);
            Worksheet chartSheet = workbook.getWorksheets().get(WorksheetIndex);
            chartSheet.setName("ChartSheet");
            chartSheet.setType(SheetType.CHART);
            int chartSheetIdx = chartSheet.getIndex();

            // 创建柱状图
            int chartIndex = chartSheet.getCharts().add(ChartType.COLUMN, 0,20,0,20);  // 添加柱状图
            var chart = chartSheet.getCharts().get(chartIndex);
            chart.getNSeries().add(result.getT1()+"!B2:B" + (rowIndex - 1), true);  // 设置数据范围
            chart.getNSeries().setCategoryData(result.getT1()+"!A2:A" + (rowIndex - 1));  // 设置类别标签范围

            // 设置图表标题
            chart.getTitle().setText(result.getT1());  // 设置图表的主标题

            workbook.getWorksheets().setActiveSheetIndex(chartSheetIdx);

            workbook.getWorksheets().setOleSize(0, 20, 0, 20);

            com.aspose.cells.ImageOrPrintOptions opts= new com.aspose.cells.ImageOrPrintOptions();
            opts.setImageFormat(com.aspose.cells.ImageFormat.getPng());
            ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
            workbook.getWorksheets().get(chartSheetIdx).getCharts().get(0).toImage(imageStream, opts);

            // 保存 Excel 文件到内存流
            ByteArrayOutputStream excelStream = new ByteArrayOutputStream();

            workbook.save(excelStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);

            Shape oleObject = builder.insertOleObject(new ByteArrayInputStream(excelStream.toByteArray()), "Excel.Sheet.8",
                                                      true, new ByteArrayInputStream(imageStream.toByteArray()));
            // 设置图表大小
            oleObject.setWidth(400);
            oleObject.setHeight(300);
        }

        // 将 Word 文档保存到内存流
        ByteArrayOutputStream wordStream = new ByteArrayOutputStream();
        doc.save(wordStream, SaveFormat.DOCX);

现在我有三个疑问希望您解答:
1.SaveFormat.EXCEL_97_TO_2003对应的是Excel.Sheet.8,那么SaveFormat.XLSX对应什么呢?
2.上面代码导出的word文档,双击柱状图编辑excel数据后,word中的柱状图没有联动更新,是我代码的问题还是得购买版权后才能开启功能呢?(ps:word文档的柱状图片上有水印Evaluation Only. Created with Aspose.Cells for Java.Copyright 2003 - 2021 Aspose Pty Ltd.)
3.如果得购买版权才能达到我的需求的话,需要年花费多少呢?

@KeYee

  1. “Excel.Sheet.8”:表示Excel 97-2003工作表。
    “Excel.Sheet.12”:表示Excel 2007或更高版本的工作表。

  2. 您需要使用以下代码Shape oleObject = builder.insertOleObject(new ByteArrayInputStream(bout.toByteArray()), "Excel.Sheet.12", false, new ByteArrayInputStream(imageStream.toByteArray()));其中“asIcon”设置为false。当您更新并保存文档中的图表数据时,它将被更新。

此外,您还可以使用oleObject.getOleFormat().setAutoUpdate(true);

  1. 您可以在此处询问有关定价或获取许可证的问题Aspose.Purchase - Free Support Forum - aspose.com.

按照你的提示,可以更新柱状图。但是有个问题,修改excel数据后虽然图也更新了,但是会超过原先尺寸,需要再手动调整柱状图大小。请问有方法可以解决这个问题吗

@KeYee 您可以尝试像这样将 DOCX 页面宽度设置为 excel 图表的宽度:

PageSetup pageSetup = doc.getFirstSection().getPageSetup(); // 从 Aspose.Words 获取
chart.getChartObject().setWidth((int)pageSetup.getPageWidth()); // 使用 Aspose.Cells 部分

并为 DOCX 文件中的 OleObject 设置页面宽度,就像这样:

double pageWidth = pageSetup.getPageWidth() - pageSetup.getRightMargin() - pageSetup.getLeftMargin();
oleObject.setWidth(pageWidth);

按照您的提示,下载完打开word,柱状图适合页面宽度一致的,但是在我编辑数据后,柱状图就撑开了,这种情况可以解决吗?我的需求是默认打开的柱状图和word等宽,打开excel编辑数据后,word上的柱状图长宽保持原样

@KeYee 我已经用你提供的第一个例子进行了测试,在我的侧图上没有展开。我使用“24.11”版本的“Aspose.Words”和“Aspose.Cells”,这是我的输出文件。

output.docx (21.4 KB)

这个柱状图右击打开excel后,切换到图形sheet之后,你看下你word上的柱状图宽度会不会改变

@KeYee 我在“Aspose.Cells”方面并不完美,但我认为你需要使用wb.getWorksheets().setOleSize。尝试通过更新以下内容来更改工作表的ole大小:

int chartRows = 20;
int chartCols = 9;

我尝试了许多方法,依然无法解决我的问题。在打开excel修改数据后,原先在word上比例正常的柱状图长宽总是会比例失调

@KeYee 当您开始编辑图表时,“MS Word”或“Excel”不会调整图表对象的大小,直到您没有单击图表为止。看起来我们无法控制这种行为。因此,如果您打开数据进行编辑,然后移动到带有图表的工作表并单击图表,它将被调整为Excel视图大小。


感谢您的帮助。还有个小问题,我想把ole对象的柱状图放在一个段落下如何实现?因为在文档的第一页段落内容只有几行,在我插入ol对象后,柱状图总是单独另起一页了不够美观,如何让柱状图位于段落文本下方而不是另起一页。代码如下:



        // 初始化 Aspose.Words 文档对象
        Document doc = new Document();
        PageSetup pageSetup = doc.getFirstSection().getPageSetup();
        DocumentBuilder builder = new DocumentBuilder(doc);

        // 插入标题并应用样式
        builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.TITLE);
        builder.getFont().setSize(24); // 字体大小
        builder.getFont().setBold(true); // 加粗
        builder.getFont().setColor(Color.BLUE); // 字体颜色
        builder.getFont().setName("微软雅黑"); // 字体
        builder.writeln(month+"月月报");

        // 插入标题 1: 数据概览,并应用 "Heading 1" 样式
        builder.getParagraphFormat().clearFormatting(); // 清除段落格式
        builder.getFont().clearFormatting();
        builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1); // 应用 "Heading 1" 样式
        builder.getFont().setName("微软雅黑");
        builder.writeln("1. 数据概览");

        // 插入描述文字并设置首行缩进
        builder.getParagraphFormat().clearFormatting(); // 清除段落格式
        builder.getParagraphFormat().setFirstLineIndent(21); // 首行缩进(约 2 个汉字)
        builder.getFont().setSize(12); // 字体大小
        builder.writeln(message);

        // 插入标题 2: 多维度图表,并应用 "Heading 1" 样式
        builder.getParagraphFormat().clearFormatting(); // 清除段落格式
        builder.getFont().clearFormatting();
        builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1); // 应用 "Heading 1" 样式
        builder.getFont().setName("微软雅黑"); // 字体
        builder.writeln("2. 多维度图表");

        // 插入描述文字
        builder.getParagraphFormat().clearFormatting(); // 清除段落格式
        builder.getParagraphFormat().setFirstLineIndent(21); // 首行缩进
        builder.getFont().setSize(12); // 字体大小
        builder.writeln("下面展示了多维度柱状图,用于分析各个指标的统计数据。");
        builder.getParagraphFormat().clearFormatting(); // 清除段落格式

        List<Tuple3<String, String, List<Data>>> results = new ArrayList<>();


        for (Tuple3<String, String, List<Data>> result : results) {
            Workbook workbook = new Workbook();
            Worksheet dataSheet =workbook.getWorksheets().get(0);
            dataSheet.setType(SheetType.WORKSHEET);
            dataSheet.setName(result.getT1());
            // 填充数据到 Excel 工作表
            dataSheet.getCells().get("A1").setValue(result.getT1());
            dataSheet.getCells().get("B1").setValue(result.getT2());

            // 将数据填充到 Excel 表格
            int rowIndex = 2;
            for (Data countData : result.getT3()) {
                dataSheet.getCells().get("A" + rowIndex).setValue(countData.getCategory());
                dataSheet.getCells().get("B" + rowIndex).setValue(countData.getCount());
                rowIndex++;
            }

            int WorksheetIndex = workbook.getWorksheets().add(SheetType.CHART);
            Worksheet chartSheet = workbook.getWorksheets().get(WorksheetIndex);
            chartSheet.setName(CHART);
            chartSheet.setType(SheetType.CHART);
            int chartSheetIdx = chartSheet.getIndex();

            // 创建柱状图
            int chartIndex = chartSheet.getCharts().add(ChartType.COLUMN_STACKED, 0,20,0,20);
            var chart = chartSheet.getCharts().get(chartIndex);
            // 设置数据范围
            chart.getNSeries().add(result.getT1()+"!B2:B" + (rowIndex - 1), true);
            // 设置类别标签范围
            chart.getNSeries().setCategoryData(result.getT1()+"!A2:A" + (rowIndex - 1));

            ImageOrPrintOptions opts= new ImageOrPrintOptions();
            opts.setSaveFormat(SaveFormat.PNG);
            //设置图像分辨率为 300 DPI
            opts.setVerticalResolution(300);
            opts.setHorizontalResolution(300);

            ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
            workbook.getWorksheets().get(chartSheetIdx).getCharts().get(0).toImage(imageStream, opts);

            // 保存 Excel 文件到内存流
            ByteArrayOutputStream excelStream = new ByteArrayOutputStream();

            workbook.save(excelStream, com.aspose.cells.SaveFormat.XLSX);

            // 将excel图表作为ole对象插入word,实现动态编辑
            Shape oleObject = builder.insertOleObject(new ByteArrayInputStream(excelStream.toByteArray()), "Excel.Sheet.12",
                                                      false, new ByteArrayInputStream(imageStream.toByteArray()));

            // 设置图表大小
            double pageWidth = pageSetup.getPageWidth() - pageSetup.getRightMargin() - pageSetup.getLeftMargin();
            oleObject.setWidth(pageWidth);
            // 锁定宽高比例
            oleObject.setAspectRatioLocked(true);
        }

        // 将 Word 文档保存到内存流
        ByteArrayOutputStream wordStream = new ByteArrayOutputStream();
        doc.save(wordStream, SaveFormat.DOCX);

        return wordStream.toByteArray();

是的,在打开excel的柱状图后会被调整为excel视图大小,无论怎么设置ole对象的宽和高都无法解决。再次感谢您的指导和帮助:)

1 Like

@KeYee 这可能是因为ole对象的高度很大,MS Word会将此对象移动到下一页。您可以尝试降低ole对象高度以避免这种情况。

设置降低ole高度没有效果,依然单独另起了一页,并且长宽比例失调。如何能保证生成的ole对象柱状图位于下面展示了多维度柱状图,用于分析各个指标的统计数据这句话下面一行开始居中展示,并且每个柱状图中间留有固定的空隙呢

@KeYee 您能提供用于创建包含不正确ole对象的ole对象或输出文件的数据吗?

String message = "基于当月会员的数据进行分析,11月份新增会员XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。";

// 初始化 Aspose.Words 文档对象
Document doc = new Document();
PageSetup pageSetup = doc.getFirstSection().getPageSetup();
DocumentBuilder builder = new DocumentBuilder(doc);

// 插入标题并应用样式
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.TITLE);
builder.getFont().setSize(24); // 字体大小
builder.getFont().setBold(true); // 加粗
builder.getFont().setColor(Color.BLUE); // 字体颜色
builder.getFont().setName("微软雅黑"); // 字体
builder.writeln("11月数据月报");

// 插入标题 1: 数据概览,并应用 "Heading 1" 样式
builder.getParagraphFormat().clearFormatting();
builder.getFont().clearFormatting();
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.getFont().setName("微软雅黑");
builder.writeln("1. 数据概览");

// 插入描述文字并设置首行缩进
builder.getParagraphFormat().clearFormatting();
builder.getParagraphFormat().setFirstLineIndent(21);
builder.getFont().setSize(12);
builder.writeln(message);

// 插入标题 2: 多维度图表,并应用 "Heading 1" 样式
builder.getParagraphFormat().clearFormatting();
builder.getFont().clearFormatting();
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.getFont().setName("微软雅黑");
builder.writeln("2. 多维度图表");

// 插入描述文字
builder.getParagraphFormat().clearFormatting();
builder.getParagraphFormat().setFirstLineIndent(21); // 首行缩进
builder.getFont().setSize(12);
builder.writeln("下面展示了多维度柱状图,用于分析各个指标的统计数据。");
builder.getParagraphFormat().clearFormatting();

List<Tuple3<String, String, List<DataCount>>> results = new ArrayList<>();
for (Tuple3<String, String, List<DataCount>> result : results) {
    Workbook workbook = new Workbook();
    Worksheet dataSheet =workbook.getWorksheets().get(0);
    dataSheet.setType(SheetType.WORKSHEET);
    dataSheet.setName(result.getT1());
    // 填充数据到 Excel 工作表
    dataSheet.getCells().get("A1").setValue(result.getT1());
    dataSheet.getCells().get("B1").setValue(result.getT2());

    // 将数据填充到 Excel 表格
    int rowIndex = 2;
    for (DataCount countData : result.getT3()) {
        dataSheet.getCells().get("A" + rowIndex).setValue(countData.getCategory());
        dataSheet.getCells().get("B" + rowIndex).setValue(countData.getCount());
        rowIndex++;
    }

    int WorksheetIndex = workbook.getWorksheets().add(SheetType.CHART);
    Worksheet chartSheet = workbook.getWorksheets().get(WorksheetIndex);
    chartSheet.setName(CHART);
    chartSheet.setType(SheetType.CHART);
    int chartSheetIdx = chartSheet.getIndex();

    // 创建柱状图
    int chartIndex = chartSheet.getCharts().add(ChartType.COLUMN_STACKED, 0,20,0,20);
    var chart = chartSheet.getCharts().get(chartIndex);
    chartSheet.getCells().getStyle().getFont().setName("微软雅黑");

    // 设置数据范围
    chart.getNSeries().add(result.getT1()+"!B2:B" + (rowIndex - 1), true);
    // 设置类别标签范围
    chart.getNSeries().setCategoryData(result.getT1()+"!A2:A" + (rowIndex - 1));
    // 设置柱状图描述
    chart.getNSeries().get(0).setName(result.getT2());
    chart.getTitle().setText(result.getT1());

    ImageOrPrintOptions opts= new ImageOrPrintOptions();
    opts.setSaveFormat(SaveFormat.PNG);
    //设置图像分辨率为 300 DPI
    opts.setVerticalResolution(300);
    opts.setHorizontalResolution(300);

    ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
    workbook.getWorksheets().get(chartSheetIdx).getCharts().get(0).toImage(imageStream, opts);

    // 保存 Excel 文件到内存流
    ByteArrayOutputStream excelStream = new ByteArrayOutputStream();

    workbook.save(excelStream, com.aspose.cells.SaveFormat.XLSX);

    // 将excel图表作为ole对象插入word,实现动态编辑
    Shape oleObject = builder.insertOleObject(new ByteArrayInputStream(excelStream.toByteArray()), "Excel.Sheet.12",
                                              false, new ByteArrayInputStream(imageStream.toByteArray()));

    // 设置图表大小
    double pageWidth = pageSetup.getPageWidth() - pageSetup.getRightMargin() - pageSetup.getLeftMargin();
    oleObject.setWidth(pageWidth);
    // 锁定宽高比例
    oleObject.setAspectRatioLocked(true);
}

// 将 Word 文档保存到内存流
ByteArrayOutputStream wordStream = new ByteArrayOutputStream();
doc.save(wordStream, SaveFormat.DOCX);

当前我的代码,word标题内容和excel的ole对象数据如上,除了ole对象的柱状图另起一页这个问题, chart.getNSeries().get(0).setName(result.getT2()); chart.getTitle().setText(result.getT1());这部分内容导出后中文乱码如何解决,我尝试了 chartSheet.getCells().getStyle().getFont().setName("微软雅黑");但是没有成功,依然乱码