@@ -13,8 +13,10 @@ import org.apache.poi.ss.usermodel.Sheet
1313import org.apache.poi.ss.usermodel.Workbook
1414import org.apache.poi.ss.usermodel.WorkbookFactory
1515import org.apache.poi.ss.util.CellReference
16+ import org.apache.poi.util.DefaultTempFileCreationStrategy
1617import org.apache.poi.util.LocaleUtil
1718import org.apache.poi.util.LocaleUtil.getUserTimeZone
19+ import org.apache.poi.util.TempFile
1820import org.apache.poi.xssf.usermodel.XSSFWorkbook
1921import org.jetbrains.kotlinx.dataframe.AnyFrame
2022import org.jetbrains.kotlinx.dataframe.AnyRow
@@ -31,6 +33,7 @@ import java.io.File
3133import java.io.InputStream
3234import java.io.OutputStream
3335import java.net.URL
36+ import java.nio.file.Files
3437import java.time.LocalDate
3538import java.time.LocalDateTime
3639import java.util.Calendar
@@ -56,6 +59,20 @@ internal class DefaultReadExcelMethod(path: String?) : AbstractDefaultReadMethod
5659
5760private const val readExcel = " readExcel"
5861
62+ /* *
63+ * To prevent [Issue #402](https://github.com/Kotlin/dataframe/issues/402):
64+ *
65+ * Creates new temp directory instead of the default `/tmp/poifiles` which would
66+ * cause permission issues for multiple users.
67+ */
68+ private fun setWorkbookTempDirectory () {
69+ val tempDir = Files .createTempDirectory(" dataframe-excel" ).toFile()
70+ .also { it.deleteOnExit() }
71+ TempFile .setTempFileCreationStrategy(
72+ DefaultTempFileCreationStrategy (tempDir)
73+ )
74+ }
75+
5976/* *
6077 * @param sheetName sheet to read. By default, the first sheet in the document
6178 * @param columns comma separated list of Excel column letters and column ranges (e.g. “A:E” or “A,C,E:F”)
@@ -72,6 +89,7 @@ public fun DataFrame.Companion.readExcel(
7289 rowsCount : Int? = null,
7390 nameRepairStrategy : NameRepairStrategy = NameRepairStrategy .CHECK_UNIQUE ,
7491): AnyFrame {
92+ setWorkbookTempDirectory()
7593 val wb = WorkbookFactory .create(url.openStream())
7694 return wb.use { readExcel(wb, sheetName, skipRows, columns, rowsCount, nameRepairStrategy) }
7795}
@@ -92,6 +110,7 @@ public fun DataFrame.Companion.readExcel(
92110 rowsCount : Int? = null,
93111 nameRepairStrategy : NameRepairStrategy = NameRepairStrategy .CHECK_UNIQUE ,
94112): AnyFrame {
113+ setWorkbookTempDirectory()
95114 val wb = WorkbookFactory .create(file)
96115 return wb.use { readExcel(it, sheetName, skipRows, columns, rowsCount, nameRepairStrategy) }
97116}
@@ -129,6 +148,7 @@ public fun DataFrame.Companion.readExcel(
129148 rowsCount : Int? = null,
130149 nameRepairStrategy : NameRepairStrategy = NameRepairStrategy .CHECK_UNIQUE ,
131150): AnyFrame {
151+ setWorkbookTempDirectory()
132152 val wb = WorkbookFactory .create(inputStream)
133153 return wb.use { readExcel(it, sheetName, skipRows, columns, rowsCount, nameRepairStrategy) }
134154}
0 commit comments