Цель: прочитать файл электронной таблицы Excel 95-2003 и загрузить результат в таблицу БД Oracle 11g. В нашем примере мы хотим прочитать данные из одной ячейки и положить их в таблицу create table HF_TMP (val VARCHAR2(50))
Алгоритм решения:
1. Загрузка файла через пользовательский интерфейс. Применяется messageFileUploadBean с типом данных BLOB.
При нажатии кнопки Загрузить происходит вставка записи в таблицу загрузок вместе с бинарным файлов Excel в blob-поле, присваивание upload_id и запуск Java-based канкарента, в который этот upload_id передается.
CO:2. Работа канкарента
Serializable[] aserializable = { uploadId }; Class[] aclass = { uploadId.getClass() }; String requestId = (String)am.invokeMethod("sendConcurrentRequest", aserializable, aclass); am.getTransaction().commit();AM:
public void sendConcurrentRequest(Number uploadId) throws RequestSubmissionException { ConcurrentRequest cpRequest = new ConcurrentRequest(this.getOADBTransaction().getJdbcConnection()); Vector requestParameters = new Vector(1); requestParameters.add(uploadId.stringValue()); int requestId = cpRequest.submitRequest(UploadHistFactBean.APPLICATION_SHORT_NAME, UploadHistFactBean.CONCURRENT_PROGRAM_NAME, null, null, false, requestParameters); }
// считываем BLOB public InputStream getFileForUploadId(){ StringBuffer strBuf = new StringBuffer(); InputStream dataStream = null; String lQuery = "select file_data from DATA_UPLOADS where request_id = :1"; String res = ""; try { OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(lQuery); statement.setInt(1, requestId); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { BLOB blob = ((OracleResultSet)resultSet).getBLOB(1); dataStream = blob.getBinaryStream(); } } catch (SQLException e) { throw OAException.wrapperException(e); } return dataStream; }
public void initialize(CpContext cpContext) throws SQLException, XMLParseException, SAXException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { connection = cpContext.getJDBCConnection(); requestId = cpContext.getReqDetails().getRequestId(); logFile = cpContext.getLogFile(); reqCompletion = cpContext.getReqCompletion(); NameValueType parameter; while (cpParameters.hasMoreElements()) { parameter = cpParameters.nextParameter(); if ("p_upload_id".equalsIgnoreCase(parametr.getName())) { this.uploadId = Integer.valueOf(parametr.getValue()).intValue(); } }
public void runProgram(CpContext cpContext) { try { initialize(cpContext); HashMap<String, String> inputParameters = new HashMap<String, String>(); inputParameters.put(DataInput.PARAMETER_PREFIX + "1", "oracle.apps.xxmy.test.bean.TemplateXML"); InputStream file = getFileForUploadId(); { логика по распарсиванию файла Excel } connection.commit(); // Успешно завершим конкаррент Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION"); reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore())); } catch (Exception e) { // Если произошла ошибка, нужно выставить конкаренту ошибочный статус и выдать в лог стек ошибки reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage()); StringWriter errStringWriter = new StringWriter(); PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true); e.printStackTrace(errPrintWriter); logFile.writeln(errStringWriter.toString(), LogFile.ERROR); } finally { cpContext.releaseJDBCConnection(); } }3. Распарсивание XLS с помощью библиотеки POI. Шаблон oracle.apps.xxmy.test.bean.TemplateXML из шага 2 содержит набор параметров для вызова API вставки в таблицу с указанием данных о том, в каких ячейках брать значения. В нашем случае:
<?xml version="1.0" encoding='windows-1251'?> <upload method="XXMY_TEST_PKG.upload_excel"> <element name="test" type="single"> <location src="sheet" sheet="Sheet1" row="0" col="0"/> </element> </upload>Пробегаясь по структуре данных и файлу данных, мы формируем вызов API:
begin XXMY_TEST_PKG.upload_excel(P_TEST => :1, P_REQUEST_ID => :2, P_UPLOAD_ID => :3, P_UPLOAD_METHOD => :4); end;Имея коллекции параметров и их значений, выполняем вызов:
public void doDbUpload() throws SQLException { OracleCallableStatement statement = (OracleCallableStatement)connection.prepareCall(this.query); ArrayList<Integer> keyList = new ArrayList<Integer>(); keyList.addAll(uploadParameters.keySet()); Collections.sort(keyList); Iterator<Integer> parameterIterator = keyList.iterator(); while (parameterIterator.hasNext()) { Integer parameterIndex = parameterIterator.next(); UploadParameter parameter = this.uploadParameters.get(parameterIndex); statement.setString(parameterIndex.intValue(), parameter.getValue()); } statement.execute(); statement.close(); }Всё. Данные из файла отправляются в таблицу.