天天看點

String literals in formulas can't be bigger than 255 characters ASCII

package xls20170828comboBox;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddressList;

/**
 * ------------------------------------------------------------------------------
 * http://wuhaidong.iteye.com/blog/2039848
 * ------------------------------------------------------------------------------
手工設定:
excel菜單欄上--資料--有效性--允許--序列,
excel菜單欄上--資料--有效性--輸入資訊.
程式現實:
首先,http://poi.apache.org/官方下載下傳POI3.2 jar包.
 
注:經本人測試轉載的文章中有一些錯誤:
 
1. 使用POI3.2.jar建立的提示框不支援中文,最終我換成了POI3.5.jar就能支援中文了.
2. DVConstraint constraint = DVConstraint.createCustomFormulaConstraint("B1");
這樣寫有點問題,提示字段中可輸入的值隻能輸入B1的内容.
這一句的意思是設定限制條件引用B1單元格中的内容,查找API後發現必須要有一個限制才行,我的靈活處理的方法是設定為BB1,
一般不會有這麼多字段,BB1沒有限制就相當于建立了一個沒有限制的單元格.
 
本為是對上一篇部落格的中内容的封裝,封裝後的方法使用起來更友善一些.
 *------------------------------------------------------------------------------
 * @author ZengWenFeng
 * @date 2017.08.28
 */
public class PoiTest2
{
	/** 
	 * 設定某些列的值隻能輸入預制的資料,顯示下拉框. 
	 *  
	 * @param sheet 要設定的sheet. 
	 * @param textlist 下拉框顯示的内容 
	 * @param firstRow 開始行 
	 * @param endRow 結束行 
	 * @param firstCol 開始列 
	 * @param endCol 結束列 
	 * @return 設定好的sheet. 
	 */
	public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol)
	{
		// 加載下拉清單内容  
		DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);
		
		// 設定資料有效性加載在哪個單元格上,四個參數分别是:起始行、終止行、起始列、終止列  
		CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
		
		// 資料有效性對象  
		HSSFDataValidation data_validation_list = new HSSFDataValidation(regions, constraint);
		sheet.addValidationData(data_validation_list);
		
		//
		return sheet;
	}

	/** 
	 * 設定單元格上提示 
	 *  
	 * @param sheet 要設定的sheet. 
	 * @param promptTitle 标題 
	 * @param promptContent 内容 
	 * @param firstRow 開始行 
	 * @param endRow 結束行 
	 * @param firstCol 開始列 
	 * @param endCol 結束列 
	 * @return 設定好的sheet. 
	 */
	public static HSSFSheet setHSSFPrompt(HSSFSheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, int firstCol, int endCol)
	{
		// 構造constraint對象  
		DVConstraint constraint = DVConstraint.createCustomFormulaConstraint("BB1");
		
		// 四個參數分别是:起始行、終止行、起始列、終止列  
		CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
		
		// 資料有效性對象  
		HSSFDataValidation data_validation_view = new HSSFDataValidation(regions, constraint);
		data_validation_view.createPromptBox(promptTitle, promptContent);
		sheet.addValidationData(data_validation_view);
		
		//
		return sheet;
	}
	
	public static void main(String[] args) throws IOException
	{
		HSSFWorkbook wb = new HSSFWorkbook();// excel檔案對象  
		HSSFSheet sheetlist = wb.createSheet("sheetlist");// 工作表對象  

		FileOutputStream out = new FileOutputStream("d:\\success.xls");
		String[] textlist = 
			{	
//				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				"清單1", "清單2", "清單3", "清單4", "清單5",
				
				
				"清單1", "清單2", "清單3", "清單4", "清單5"
			};
		
//		Exception in thread "main" java.lang.IllegalArgumentException: String literals in formulas can't be bigger than 255 characters ASCII
//		at org.apache.poi.ss.formula.ptg.StringPtg.<init>(StringPtg.java:65)
//		at org.apache.poi.hssf.usermodel.DVConstraint.createListFormula(DVConstraint.java:412)
//		at org.apache.poi.hssf.usermodel.DVConstraint.createFormulas(DVConstraint.java:385)
//		at org.apache.poi.hssf.usermodel.HSSFDataValidation.createDVRecord(HSSFDataValidation.java:195)
//		at org.apache.poi.hssf.usermodel.HSSFSheet.addValidationData(HSSFSheet.java:396)
//		at xls20170828comboBox.PoiTest2.setHSSFValidation(PoiTest2.java:58)
//		at xls20170828comboBox.PoiTest2.main(PoiTest2.java:161)

		//                                       行号開始、行号結束、列号開始、列号結束
		sheetlist = setHSSFValidation(sheetlist, textlist, 0, 500, 0, 0);// 第一列的前501行都設定為選擇清單形式.  
//		sheetlist = setHSSFPrompt(sheetlist, "promt Title", "prompt Content", 0, 500, 1, 1);// 第二列的前501行都設定提示.  

		wb.write(out);
		out.close();
	}

}
           

參考解決方案

http://www.mamicode.com/info-detail-1442009.html

然後呢:

String literals in formulas can't be bigger than 255 characters ASCII