Отобразить отформатированное значение ячейки листа Excel на JTextPane

У меня есть лист excel со значениями ячеек, например

"Это жирный текст".

И я хочу отобразить его на JTextPane. Я думаю, что у меня есть какое-то отношение к RichTextString и StyledDocument JTextPane, но я не уверен, пожалуйста, помогите мне с этим.


person Mustafa    schedule 06.01.2014    source источник
comment
Решение сработало или возникли дополнительные сложности?   -  person StoopidDonut    schedule 08.01.2014
comment
Да, это сработало, но у меня возникают сложности, когда я хочу сохранить текст jTextPane в файл excel. потому что он дает html-код. Любое решение?   -  person Mustafa    schedule 08.01.2014


Ответы (1)


Вы можете записать полученное значение ячейки из Excel как html до JTextPane.

Ранее я ссылался на этот пример для извлечения html формат значений ячеек из excel - каждый раз работает как шарм.

Я расширил код, включив параметр JTextPane для отображения содержимого вашей ячейки.

Базовый код:

static boolean boldsie = false;

    public static void main(String... args) {
        File excel = new File("\\test.xlsx");
        FileInputStream fis;
        try {
            fis = new FileInputStream(excel);
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            XSSFSheet ws = wb.getSheet("Sheet1");

            int rowNum = ws.getLastRowNum() + 1;
            int colNum = ws.getRow(0).getLastCellNum();
            String[][] data = new String[rowNum][colNum];

            for (int i = 0; i < rowNum; i++) {
                XSSFRow row = ws.getRow(i);
                for (int j = 0; j < colNum; j++) {
                    XSSFCell cell = row.getCell(j);
                    String value = cell.toString();
                    data[i][j] = value;

                    showDataInTextPane(ws, cell.getReference());

                }
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private static void showDataInTextPane(XSSFSheet ws, String reference) {
        JFrame frame = new JFrame("Formatted POI Sample");
        Container content = frame.getContentPane();
        JPanel panel = new JPanel();

        JTextPane textPane = new JTextPane();
        textPane.setContentType("text/html");

        textPane.setText(getHtmlFromExcel(ws, reference));

        panel.setLayout(new BorderLayout());
        panel.add(textPane);

        content.add(panel);
        frame.setSize(100, 100);
        frame.setVisible(true);
    }

    public static String getHtmlFromExcel(XSSFSheet sheet, String cellName) {

        CellReference cellReference = new CellReference(cellName);
        XSSFRow row = sheet.getRow(cellReference.getRow());
        XSSFCell cell = row.getCell(cellReference.getCol());

        XSSFRichTextString cellText = cell.getRichStringCellValue();

        String htmlCode = "";

        for (int i = 0; i < cellText.numFormattingRuns(); i++) {
            try {
                htmlCode += getFormatFromFont(cellText.getFontAtIndex(i));
            } catch (NullPointerException ex) {

            }
            try {
                htmlCode += getFormatFromFont(cellText
                        .getFontOfFormattingRun(i));
            } catch (NullPointerException ex) {

            }

            htmlCode += cellText.getString().substring(
                    cellText.getIndexOfFormattingRun(i),
                    cellText.getIndexOfFormattingRun(i)
                            + cellText.getLengthOfFormattingRun(i));
        }

        if (boldsie) {
            htmlCode += "</b>";
            boldsie = false;
        }

        return htmlCode;
    }

    private static String getFormatFromFont(XSSFFont font) {
        String formatHtmlCode = "";
        if (font.getBold() && !boldsie) {
            formatHtmlCode += "<b>";
            boldsie = true;
        } else if (!font.getBold() && boldsie) {
            formatHtmlCode += "</b>";
            boldsie = false;
        }

        return formatHtmlCode;
    }

Вывод:

введите здесь описание изображения

Вы можете расширить его в соответствии с вашими потребностями, чтобы сделать его более общим, привести в соответствие с лучшими практиками и включить другие форматы, такие как курсив и т. д.

person StoopidDonut    schedule 06.01.2014