From 0678b16f141980cb846c7e0e2c38cdcb25573867 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 20 Jul 2021 12:43:52 +0000 Subject: [PATCH] right to left xlsx test git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1891682 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/TestXSSFWorkbook.java | 47 ++++++++++++------ test-data/spreadsheet/right-to-left.xlsx | Bin 0 -> 14478 bytes 2 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 test-data/spreadsheet/right-to-left.xlsx diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index ef17baa8e7..58beb8896b 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -31,11 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.Iterator; @@ -58,16 +54,10 @@ import org.apache.poi.openxml4j.opc.internal.FileHelper; import org.apache.poi.openxml4j.opc.internal.MemoryPackagePart; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; import org.apache.poi.ss.tests.usermodel.BaseTestXWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.RichTextString; -import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.AreaReference; +import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.util.IOUtils; import org.apache.poi.util.LocaleUtil; @@ -83,7 +73,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode; -public final class TestXSSFWorkbook extends BaseTestXWorkbook { +public final class TestXSSFWorkbook extends BaseTestXWorkbook { public TestXSSFWorkbook() { super(XSSFITestDataProvider.instance); @@ -1136,4 +1126,33 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { wbBack.close(); wbBack2.close(); } + + @Test + void testRightToLeft() throws IOException { + try(XSSFWorkbook workbook = openSampleWorkbook("right-to-left.xlsx")){ + Sheet sheet = workbook.getSheet("عربى"); + + Cell A1 = sheet.getRow(0).getCell(0); + Cell A2 = sheet.getRow(1).getCell(0); + Cell A3 = sheet.getRow(2).getCell(0); + Cell A4 = sheet.getRow(3).getCell(0); + + expectFormattedContent(A1, "نص"); + expectFormattedContent(A2, "123"); //this should really be ۱۲۳ + expectFormattedContent(A3, "text with comment"); + expectFormattedContent(A4, " עִבְרִית and اَلْعَرَبِيَّةُ"); + + Comment a3Comment = sheet.getCellComment(new CellAddress("A3")); + assertTrue(a3Comment.getString().getString().contains("تعليق الاختبا")); + } + } + + private static void expectFormattedContent(Cell cell, String value) { + assertEquals(value, new DataFormatter().formatCellValue(cell), + "Cell " + ref(cell) + " has wrong formatted content."); + } + + private static String ref(Cell cell) { + return new CellReference(cell).formatAsString(); + } } diff --git a/test-data/spreadsheet/right-to-left.xlsx b/test-data/spreadsheet/right-to-left.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48e33537238af15a076c72ea68281f57fcf12df4 GIT binary patch literal 14478 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
fBi#o~cl@_I2Vh^gT!+*KJwgld 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 literal 0 HcmV?d00001 -- 2.39.5