Чтение даты оценивает от ячейки Excel с помощью ПОИ HSSF API

SQLBulkCopy в SQL Server невероятно быстр. К сожалению, я обнаружил, что OracleBulkCopy намного медленнее. Также у него есть проблемы:

  • Вы должны быть очень уверены, что ваши входные данные чисты, если вы планируете использовать OracleBulkCopy. Если происходит нарушение первичного ключа, ORA-26026 поднимается, и это кажется неисправимым. Попытка перестроить индекс не помогает, и любая последующая вставка в таблицу завершается неудачей, также обычные вставки.
  • Даже если данные чистые, я обнаружил, что OracleBulkCopy иногда застревает внутри WriteToServer. Проблема, похоже, зависит от размера партии. В моих тестовых данных проблема повторяется в той же точке моего теста, когда я повторяю это. Используйте больший или меньший размер пакета, и проблема не возникает. Я вижу, что скорость более нерегулярна при больших размерах пакетов, это указывает на проблемы, связанные с управлением памятью.

На самом деле System.Data.OracleClient.OracleDataAdapter работает быстрее, чем OracleBulkCopy, если вы хотите заполнить таблицу небольшими записями, но множеством строк. Однако вам нужно настроить размер пакета, оптимальный BatchSize для OracleDataAdapter меньше, чем для OracleBulkCopy.

Я провел свой тест на компьютере с Windows 7 с исполняемым файлом x86 и 32-битным клиентом ODP.Net 2.112.1.0. , OracleDataAdapter является частью System.Data.OracleClient 2.0.0.0. Мой набор тестов составляет около 600 000 строк с максимальным размером записи. 102 байта (средний размер 43 символа). Источником данных является текстовый файл размером 25 МБ, читаемый построчно как поток.

В моем тесте я построил таблицу входных данных до фиксированного размера таблицы, а затем использовал OracleBulkCopy или OracleDataAdapter для копирования блока данных на сервер. Я оставил BatchSize как 0 в OracleBulkCopy (чтобы текущее содержимое таблицы копировалось как один пакет) и установил для него размер таблицы в OracleDataAdapter (опять же, это должно создать один пакет внутри). Лучшие результаты:

  • OracleBulkCopy: размер таблицы = 500, общая продолжительность 4'22 "
  • OracleDataAdapter: размер таблицы = 100, общая продолжительность 3'03"

Для сравнения:

  • SqlBulkCopy: размер таблицы = 1000, общая продолжительность 0'15 "
  • SqlDataAdapter: размер таблицы = 1000, общая продолжительность 8'05"

Тот же клиентский компьютер, тестовым сервером является SQL Server 2008 R2. Для SQL Server массовое копирование - это, безусловно, лучший способ. Это не только в целом быстрее, но нагрузка на сервер также ниже, чем при использовании адаптера данных. Жаль, что OracleBulkCopy не предлагает такой же интерфейс - API BulkCopy гораздо проще в использовании, чем DataAdapter.

30
задан Randomness 12 June 2011 в 14:20
поделиться

3 ответа

Вы можете взглянуть на:

HSSFDateUtil.isCellDateFormatted()

Более подробную информацию о HSSFDateUtil см. В API формата POI ужасной электронной таблицы:

http://poi.apache.org/apidocs/org/ apache / poi / hssf / usermodel / HSSFDateUtil.html

Это также предоставляет некоторые вспомогательные методы для возврата данных Excel getExcelDate () и Java-дат getJavaDate () . Однако вам следует быть осторожными с разными форматами даты ...

37
ответ дан 27 November 2019 в 23:29
поделиться

Excel обрабатывает дату и время как числа ... Джон сказал это лучше, поэтому я не буду повторять его здесь ...

Однако, образец кода для того, что вы задали в вопросе, находится на http://poi.apache.org/spreadsheet/quick -guide.html # CellContents

6
ответ дан 27 November 2019 в 23:29
поделиться

Если вы используете POI 3.5, вы можете использовать следующий метод

cell.getDateCellValue (). Это будет работать и для Excel 2007.

6
ответ дан 27 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: