построить файл Excel и отправить его клиенту jax-rs java - PullRequest
0 голосов
/ 27 августа 2018

Привет! Я пытаюсь динамически построить данные Excel из конечной точки и вернуть их обратно моему клиенту, используя java JAX-RS

Так что сейчас у меня есть простая кнопка, которая вызывает мою функцию, которая вызываетэта конечная точка Java, и я пытаюсь использовать StringBuilder для создания данных, которые я хочу вернуть, положить их в CSV XLS или что-то еще и вернуть их клиенту.

@GET  
    @Path("/excelregisterbycountry")  
    @Produces(MediaType.APPLICATION_OCTET_STREAM)  
    public Response excelRegister(
            @QueryParam("ModelNumber") String modelNbr,
            @DefaultValue("US") @QueryParam("Country") String country) { 

        String myQuery = "";


        try {
            database = new EstateDatabaseManager(azureHost, azureDB);

        } catch (Exception e) {
            connectionFailed = true;
            slrLog.write(DB_CONNECT_FAIL + e.getMessage());
        }

        if (!connectionFailed) {


                 myQuery = "SELECT distinct spr.country_code, spr.store_nbr, spr.register_nbr, spr.os_version_nbr, sco.adkversion, sco.termType, RTRIM(spr.bios_version_nbr), RTRIM(rt.model_nbr), st.store_type_desc, psi.os_level_id, psi.gsa_level_id, RTRIM(psi.self_checkout_type_cd), psi.si_level, psi.pf_level " +
                          "FROM str_pos_register2 spr " +
                          "JOIN register_type rt " +
                          "ON rt.register_type_cd = spr.register_type_cd " +
                          "join pos_store_info3 psi " +
                          "ON psi.country_code = spr.country_code " +
                          "AND psi.store_nbr = spr.store_nbr " +
                          "join store_type as st " +
                          "on psi.store_type_cd = st.store_type_cd " +
                          "Left join sco.daily sco " +
                          "on spr.register_nbr = sco.registernbr and  spr.country_code = sco.countryCode and spr.store_nbr = sco.storeNbr and cast(spr.last_check_ts as date) = sco.reportDate " +
                          "WHERE spr.country_code <> '??' " +
                          "AND psi.store_status_code = 0 " +
                          "AND rt.model_nbr = ? " +
                          "AND spr.country_code = ? " +
                          "AND spr.last_check_ts > (CURRENT_TIMESTAMP -7) "+
                          "ORDER BY spr.store_nbr";
            }

            try {
                    StringBuilder sb = new StringBuilder();

                    sb.append("Country Code");
                    sb.append(",");
                    sb.append("Store Number");
                    sb.append(",");
                    sb.append("Register NUmber");
                    sb.append(",");
                    sb.append("OS Version");
                    sb.append(",");
                    sb.append("ADK Version");
                    sb.append(",");
                    sb.append("Term Type");
                    sb.append(",");
                    sb.append("Bios Version");
                    sb.append(",");
                    sb.append("Model Number");
                    sb.append(",");
                    sb.append("Store Type");
                    sb.append(",");
                    sb.append("OS Level ID");
                    sb.append(",");
                    sb.append("GSA Level ID");
                    sb.append(",");
                    sb.append("Self Checkout Ind");
                    sb.append(",");
                    sb.append("siLevel");
                    sb.append(",");
                    sb.append("pfLevel");
                    sb.append(",");
                    sb.append("\n");
                trouxInfoScoRegisterObject[] dataObject = null;
                List<trouxInfoScoRegisterObject> dataStore = new ArrayList<trouxInfoScoRegisterObject>();
                trouxInfoScoRegisterObject trouxRegister = null;
                PackageType<trouxInfoScoRegisterObject> t = new PackageType<>();

                database.prepareSQL(myQuery);
                database.addParameter(modelNbr, EstateDatabaseManager.TYPE_STRING);
                database.addParameter(country, EstateDatabaseManager.TYPE_STRING);
                database.query();
                while (database.nextRow()) {
                    trouxRegister = new trouxInfoScoRegisterObject();
                    String countryCode = database.getColumn(1);
                    Integer storeNumber = database.getColumnInt(2);
                    Integer registerNumber = database.getColumnInt(3);
                    String osVersionNbr = database.getColumn(4);
                    String adkVersion = database.getColumn(5);
                    String termType = database.getColumn(6);
                    String biosVersionNbr = database.getColumn(7);
                    String ModelNumber = database.getColumn(8);
                    String storeType = database.getColumn(9);
                    String osLevelId = database.getColumn(10);
                    String gsaLevelId = database.getColumn(11);
                    String selfCheckoutInd = database.getColumn(12);
                    String siLevel = database.getColumn(13);
                    String pfLevel = database.getColumn(14);

                    sb.append(countryCode);
                    sb.append(",");
                    sb.append(storeNumber);
                    sb.append(",");
                    sb.append(registerNumber);
                    sb.append(",");
                    sb.append(osVersionNbr);
                    sb.append(",");
                    sb.append(adkVersion);
                    sb.append(",");
                    sb.append(termType);
                    sb.append(",");
                    sb.append(biosVersionNbr);
                    sb.append(",");
                    sb.append(ModelNumber);
                    sb.append(",");
                    sb.append(storeType);
                    sb.append(",");
                    sb.append(osLevelId);
                    sb.append(",");
                    sb.append(gsaLevelId);
                    sb.append(",");
                    sb.append(selfCheckoutInd);
                    sb.append(",");
                    sb.append(siLevel);
                    sb.append(",");
                    sb.append(pfLevel);
                    sb.append(",");
                    sb.append("\n");


                }

                FileWriter file = new FileWriter("test.csv");
                file.append(sb.toString());
                ResponseBuilder rb = Response.ok(file);
                rb.header("content-disposition", "attachment; filename=rest-test.xlsx");
                return rb.build();


            }catch(Exception e) {
                slrLog.write(NEXT_ROW_ERR + e.getMessage());
                }   

Я пытаюсь собрать все это, а затем просто вернуть его обратно клиенту. Я думаю, что моя проблема в том, что мне не нужен FileWriter, который ищет для записи StringBuilder файл, который мне не нуженЯ просто хочу вернуть то, что StringBuilder создает в формате CSV.все работает без сбоев, пока в ответе не появится источник не найден, потому что, конечно, у меня нигде нет test.csv.Я попытался сделать response.ok(sb.tostring()), но он просто возвращает мои данные в виде простого текста обратно клиенту, а не в файл CSV или Excel.Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 27 августа 2018
  1. Не используйте application/octet-stream только потому, что это загрузка файла.Используйте правильный тип пантомимы, основанный на том, что данные на самом деле.Если это файл CSV, то используйте text/csv, поскольку это стандарт 1

    @Produces("text/csv")
    
  2. Для объекта просто верните строку.Это все, что вам нужно сделать.Нет необходимости в File или FileWriter или любом другом промежуточном хранилище.

    return Response.ok(sb.toString())
            .header(HttpHeaders.CONTENT_DISPOSITION, 
                    "attachment;filename=test.csv")
            .build();
    

И это все.Довольно просто.

Обратите внимание, что файлы CSV и Excel - это не одно и то же.Файл CSV - это текстовый файл, а файлы Excel - это двоичные файлы.Ваши данные являются данными CSV, поэтому я не уверен, почему вы помечаете имя файла как файл .xls.Это должно быть .csv


1. Неполный список типов MIME

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...