Двойные значения Apache POI в ComboBox

Я хочу иметь ComboBox со следующими записями:

{"0,5", "1", "1,5", "2", "2,5"}

Я использую DataValidation:

    DataValidation dataValidation = null;
    DataValidationConstraint constraint = null;
    DataValidationHelper validationHelper = null;

    validationHelper = new XSSFDataValidationHelper(sheet);
    CellRangeAddressList addressList = new  CellRangeAddressList(row, row, col, col);
    constraint = validationHelper.createExplicitListConstraint(list);
    dataValidation = validationHelper.createValidation(constraint, addressList);
    dataValidation.setSuppressDropDownArrow(true);   
    sheet.addValidationData(dataValidation);

Список имеет следующую структуру:

список = новая строка [] { "0,5", "1", "1,5", "2", "2,5" }

Но после создания файла excel в раскрывающемся списке есть что-то еще.

0, 5, 1, 1, 5

Это почему?

Если я использую обозначение точки (0,5, 1, 1,5), следующая проблема заключается в том, что когда я выбираю из ComboBox, excel автоматически форматирует его до даты, например, 1,5 -> 01. Май


person sHarivaRi    schedule 14.07.2017    source источник


Ответы (1)


Из вашего описания кажется, что в вашем Excel десятичный разделитель - это запятая из ваших текущих настроек локали. Таким образом, эта запятая в {"0,5", "1", "1,5", "2", "2,5"} конфликтует с запятой, используемой в качестве разделителя списка в формуле ограничения списка. Это связано с тем, что эта формула ограничения списка будет <formula1>"0,5,1,1,5,2,2,5"</formula1>.

При использовании {"0.5", "1", "1.5", "2", "2.5"} формула ограничения списка будет <formula1>"0.5,1,1.5,2,2.5"</formula1>. Но теперь точка в этой формуле находится в конфликте с вашими языковыми настройками, имеющими запятую в качестве десятичного разделителя и точку в качестве разделителя в литералах даты.

Это хорошо известная Excel проблема. Текущие версии Excel решают эту проблему, используя другой вид хранения ограничения списка: <x12ac:list>"0,5",1,"1,5",2,"2,5"</x12ac:list> вместо: <formula1>"0,5,1,1,5,2,2,5"</formula1>. Но apache poi не поддерживает это.

В качестве обходного пути я предлагаю использовать скрытый лист для хранения элементов списка.

Пример:

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import org.apache.poi.ss.util.*;

class CreateExcelDataValidationListName {

 public static void main(String[] args) throws Exception{

   Workbook workbook = new XSSFWorkbook();  

   //create sheet for storing the list items:
   Sheet sheet = workbook.createSheet("ListSheet");
   sheet.createRow(0).createCell(0).setCellValue("SourceList");
   int r = 1;
   for (double d = 0.5; d < 3; d+=0.5) {
    sheet.createRow(r++).createCell(0).setCellValue(d);
   }
   //unselect that sheet because we will hide it later
   sheet.setSelected(false);
   //create a named range for the list contraint
   Name namedCell = workbook.createName();
   namedCell.setNameName("SourceList");
   String reference = "ListSheet!$A$2:$A$5";
   namedCell.setRefersToFormula(reference);

   //create the visible sheet
   sheet = workbook.createSheet("Sheet1");

   sheet.createRow(0).createCell(0).setCellValue("Take the ListItems from B1:");
   sheet.setActiveCell(new CellAddress("B1"));

   sheet.autoSizeColumn(0);

   //create the data validation
   DataValidationHelper dvHelper = sheet.getDataValidationHelper();
   DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint("SourceList");
   CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 1, 1);            
   DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);

   sheet.addValidationData(validation);

   //hide the ListSheet
   workbook.setSheetHidden(0, true);
   //set Sheet1 active
   workbook.setActiveSheet(1);

   FileOutputStream out = new FileOutputStream("CreateExcelDataValidationList.xlsx");
   workbook.write(out);
   out.close();
   workbook.close();

 }
}
person Axel Richter    schedule 15.07.2017