Added method for XLSX reader to disable the sharedStringsFileCache
This commit is contained in:
parent
2a5f4f973e
commit
d52e87d4bd
@ -34,8 +34,8 @@ class SharedStringsHelper
|
|||||||
/** Value to use to escape the line feed character ("\n") */
|
/** Value to use to escape the line feed character ("\n") */
|
||||||
const ESCAPED_LINE_FEED_CHARACTER = '_x000A_';
|
const ESCAPED_LINE_FEED_CHARACTER = '_x000A_';
|
||||||
|
|
||||||
/** This will increase your memory usage but can improve your execution time */
|
/** Disabling this will increase your memory usage but can improve your execution time */
|
||||||
static public $KEEP_ALL_STRINGS_IN_MEMORY = false;
|
protected $useSharedStringsFileCache;
|
||||||
|
|
||||||
/** @var string Path of the XLSX file being read */
|
/** @var string Path of the XLSX file being read */
|
||||||
protected $filePath;
|
protected $filePath;
|
||||||
@ -64,10 +64,12 @@ class SharedStringsHelper
|
|||||||
/**
|
/**
|
||||||
* @param string $filePath Path of the XLSX file being read
|
* @param string $filePath Path of the XLSX file being read
|
||||||
* @param string|void $tempFolder Temporary folder where the temporary files to store shared strings will be stored
|
* @param string|void $tempFolder Temporary folder where the temporary files to store shared strings will be stored
|
||||||
|
* @param bool|void $useSharedStringsFileCache Disabling this will increase your memory usage but can improve your execution time
|
||||||
*/
|
*/
|
||||||
public function __construct($filePath, $tempFolder = null)
|
public function __construct($filePath, $tempFolder = null, $useSharedStringsFileCache = true)
|
||||||
{
|
{
|
||||||
$this->filePath = $filePath;
|
$this->filePath = $filePath;
|
||||||
|
$this->useSharedStringsFileCache = $useSharedStringsFileCache;
|
||||||
|
|
||||||
$rootTempFolder = ($tempFolder) ?: sys_get_temp_dir();
|
$rootTempFolder = ($tempFolder) ?: sys_get_temp_dir();
|
||||||
$this->fileSystemHelper = new FileSystemHelper($rootTempFolder);
|
$this->fileSystemHelper = new FileSystemHelper($rootTempFolder);
|
||||||
@ -144,18 +146,18 @@ class SharedStringsHelper
|
|||||||
|
|
||||||
$unescapedTextValue = $escaper->unescape($textValue);
|
$unescapedTextValue = $escaper->unescape($textValue);
|
||||||
|
|
||||||
if (self::$KEEP_ALL_STRINGS_IN_MEMORY) {
|
if ($this->useSharedStringsFileCache) {
|
||||||
if (!Isset($this->inMemoryContents)) {
|
|
||||||
$this->inMemoryContents = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->inMemoryContents[$sharedStringIndex] = $unescapedTextValue;
|
|
||||||
} else {
|
|
||||||
// The shared string retrieval logic expects each cell data to be on one line only
|
// The shared string retrieval logic expects each cell data to be on one line only
|
||||||
// Encoding the line feed character allows to preserve this assumption
|
// Encoding the line feed character allows to preserve this assumption
|
||||||
$lineFeedEncodedTextValue = $this->escapeLineFeed($unescapedTextValue);
|
$lineFeedEncodedTextValue = $this->escapeLineFeed($unescapedTextValue);
|
||||||
|
|
||||||
$this->writeSharedStringToTempFile($lineFeedEncodedTextValue, $sharedStringIndex);
|
$this->writeSharedStringToTempFile($lineFeedEncodedTextValue, $sharedStringIndex);
|
||||||
|
} else {
|
||||||
|
if (!isset($this->inMemoryContents)) {
|
||||||
|
$this->inMemoryContents = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->inMemoryContents[$sharedStringIndex] = $unescapedTextValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sharedStringIndex++;
|
$sharedStringIndex++;
|
||||||
@ -276,11 +278,7 @@ class SharedStringsHelper
|
|||||||
{
|
{
|
||||||
$sharedString = null;
|
$sharedString = null;
|
||||||
|
|
||||||
if (self::$KEEP_ALL_STRINGS_IN_MEMORY) {
|
if ($this->useSharedStringsFileCache) {
|
||||||
if (isset($this->inMemoryContents) && array_key_exists($sharedStringIndex, $this->inMemoryContents)) {
|
|
||||||
$sharedString = $this->inMemoryContents[$sharedStringIndex];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$tempFilePath = $this->getSharedStringTempFilePath($sharedStringIndex);
|
$tempFilePath = $this->getSharedStringTempFilePath($sharedStringIndex);
|
||||||
$indexInFile = $sharedStringIndex % self::MAX_NUM_STRINGS_PER_TEMP_FILE;
|
$indexInFile = $sharedStringIndex % self::MAX_NUM_STRINGS_PER_TEMP_FILE;
|
||||||
|
|
||||||
@ -300,6 +298,10 @@ class SharedStringsHelper
|
|||||||
$escapedSharedString = $this->inMemoryContents[$indexInFile];
|
$escapedSharedString = $this->inMemoryContents[$indexInFile];
|
||||||
$sharedString = $this->unescapeLineFeed($escapedSharedString);
|
$sharedString = $this->unescapeLineFeed($escapedSharedString);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (is_array($this->inMemoryContents) && array_key_exists($sharedStringIndex, $this->inMemoryContents)) {
|
||||||
|
$sharedString = $this->inMemoryContents[$sharedStringIndex];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($sharedString === null) {
|
if ($sharedString === null) {
|
||||||
|
@ -24,6 +24,9 @@ class XLSX extends AbstractReader
|
|||||||
|
|
||||||
/** @var string Temporary folder where the temporary files will be created */
|
/** @var string Temporary folder where the temporary files will be created */
|
||||||
protected $tempFolder;
|
protected $tempFolder;
|
||||||
|
|
||||||
|
/** @var bool Disabling this will increase your memory usage but can improve your execution time */
|
||||||
|
protected $useSharedStringsFileCache = true;
|
||||||
|
|
||||||
/** @var \ZipArchive */
|
/** @var \ZipArchive */
|
||||||
protected $zip;
|
protected $zip;
|
||||||
@ -55,6 +58,19 @@ class XLSX extends AbstractReader
|
|||||||
$this->tempFolder = $tempFolder;
|
$this->tempFolder = $tempFolder;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disabling the shared strings file cache will increase your memory usage but can improve your execution time.
|
||||||
|
* The shared strings file cache is active by default.
|
||||||
|
*
|
||||||
|
* @param bool $useSharedStringsFileCache
|
||||||
|
* @return XLSX
|
||||||
|
*/
|
||||||
|
public function setUseSharedStringsFileCache($useSharedStringsFileCache)
|
||||||
|
{
|
||||||
|
$this->useSharedStringsFileCache = $useSharedStringsFileCache;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens the file at the given file path to make it ready to be read.
|
* Opens the file at the given file path to make it ready to be read.
|
||||||
@ -72,7 +88,7 @@ class XLSX extends AbstractReader
|
|||||||
$this->zip = new \ZipArchive();
|
$this->zip = new \ZipArchive();
|
||||||
|
|
||||||
if ($this->zip->open($filePath) === true) {
|
if ($this->zip->open($filePath) === true) {
|
||||||
$this->sharedStringsHelper = new SharedStringsHelper($filePath, $this->tempFolder);
|
$this->sharedStringsHelper = new SharedStringsHelper($filePath, $this->tempFolder, $this->useSharedStringsFileCache);
|
||||||
|
|
||||||
if ($this->sharedStringsHelper->hasSharedStrings()) {
|
if ($this->sharedStringsHelper->hasSharedStrings()) {
|
||||||
// Extracts all the strings from the worksheets for easy access in the future
|
// Extracts all the strings from the worksheets for easy access in the future
|
||||||
|
Loading…
x
Reference in New Issue
Block a user