这就很不爽了,每次打开Excel的时候,还要把文字多的单元格全部用鼠标单击一下,才能按照程序设定的显示方式显示。不过,后来仔细想一下,其实就是需要文字按照单元格设定的宽度/高度显示文本就行了,API中应该有相应的方法来实现的,只是我没找到而已。功夫不负有心人,在Google的帮助下,终于在百花丛中找到了解决办法:
WritableFont fontTitle = new WritableFont(WritableFont.TIMES, 9, WritableFont.NO_BOLD)
fontTitle.setColour(jxl.format.Colour.RED)
WritableCellFormat formatTitle = new WritableCellFormat(fontTitle)
formatTitle.setWrap(true)
/*-------------------------------------------------------------------------*/
WritableSheet m_sheet = null
m_sheet = m_writeBook.createSheet("第一页", 0)
m_sheet.setColumnView(0, 10)
m_sheet.setRowView(0, 500)
Label label = new Label(0, 0, "阿科是个不错的小伙子阿科是个不错" +
"的小伙子阿科是个不错的小伙子", format)
//将定义好的单元格添加到工作表中
m_sheet.addCell(label)
如上例当中,虽然列宽设置的仅仅是10,而文字的长度远远的超过10,但是由于使用WritableCellFormat的设置选项: formatTitle.setWrap(true)。从而使得单元格的文字按照单元格的列宽来自动换行显示。
// 数字的公式计算
Number n = new jxl write Number( )// A
sheet addCell(n)
n = new Number( )// B
sheet addCell(n)
NumberFormat dp = new NumberFormat( # ### )// 设置单元格里面的数字格式
WritableCellFormat dp cell = new WritableCellFormat(dp )
dp cell setWrap(true)
Formula f = new Formula( (a +b )/ dp cell)// 设置C 公式
sheet addCell(f)
f = new Formula( SUM(A :B ) dp cell)// 设置D 公式
sheet addCell(f)
// 设置sheet的样式
sheet getSettings() setProtected(true)// 设置xls的保护 单元格为只读的
sheet getSettings() setPassword( )// 设置xls的密码
sheet getSettings() setDefaultColumnWidth( )// 设置列的默认宽度 cm左右
sheet setRowView( )// 设置第 行高度
sheet setRowView( false)// 这样可以自动把行高扩展
sheet setColumnView( )// 设置第 列宽度 cm左右
rgeCells( )// 合并单元格 合并A B 也就是 列 行 与 列 行之间的矩形
// 设置边框
drawRect(sheet BorderLineStyle THICK Colour BLACK null)
rgeCells( )
wwb write()
wwb close()
os close()
}
public static void drawRect(WritableSheet sheet int x int y int width
int height BorderLineStyle style Colour BorderColor
Colour bgColor) throws WriteException {
for (int w = w <widthw++) {
for (int h = h <heighth++) {
WritableCellFormat alignStyle = new WritableCellFormat()// 单元格样式
alignStyle setAlignment(Alignment CENTRE)// 设置对齐方式
alignStyle setVerticalAlignment(VerticalAlignment CENTRE)// 设置对齐方式
if (h == )// 画上
alignStyle setBorder(Border TOP style BorderColor)// 设置边框的颜色和样式
if (w == )// 画左
alignStyle setBorder(Border LEFT style BorderColor)// 设置边框的颜色和样式
if (w == width )// 画右
alignStyle setBorder(Border RIGHT style BorderColor)// 设置边框的颜色和样式
if (h == height )// 画下
alignStyle setBorder(Border BOTTOM style BorderColor)// 设置边框的颜色和样式
// drawLine(sheet x y Border BOTTOM)
if (bgColor != null)
alignStyle setBackground(bgColor)// 背静色
Label mergelabel = new Label(x y alignStyle)
// topleftXIndex topleftYIndex bottomRightXIndex
// bottomRightYIndex
// rgeCells( )
sheet addCell(mergelabel)
y++
}
y = height
x++
}
}
public static ArrayList<String>sampleReadExcel(File inputFile
int inputFileSheetIndex) throws Exception {
ArrayList<String>list = new ArrayList<String>()
Workbook book = null
Cell cell = null
// 避免乱码的设置
WorkbookSettings setting = new WorkbookSettings()
java util Locale locale = new java util Locale( zh CN )
setting setLocale(locale)
setting setEncoding( ISO )
book = Workbook getWorkbook(inputFile setting)
Sheet sheet = book getSheet(inputFileSheetIndex)
for (int rowIndex = rowIndex <sheet getRows()rowIndex++) {// Excel第一行为表头 因此J初值设为
for (int colIndex = colIndex <sheet getColumns()colIndex++) {// 只需从Excel中取出 列
cell = sheet getCell(colIndex rowIndex)
list add(cell getContents())
}
}
// 【问题 如果在实际部署的时候没有写下面这句是否会导致不断消耗掉服务器的内存?jxl里面有个ReadWrite java没有关闭读的 只关闭了写的】
book close()
return list
}
public static void setCellValueDirectly(WritableSheet sheet Cell cell
Object newValue CellType type) throws Exception {
if (type == CellType DATE || type == CellType DATE_FORMULA) {
sheet addCell(new jxl write DateTime(cell getColumn() cell
getRow() (Date) newValue
new jxl write WritableCellFormat(cell getCellFormat())))
} else if (type == CellType NUMBER || type == CellType NUMBER_FORMULA) {
sheet addCell(new jxl write Number(cell getColumn() cell getRow()
((Double) newValue) doublue()
new jxl write WritableCellFormat(cell getCellFormat())))
} else if (type == CellType LABEL || type == CellType STRING_FORMULA) {
sheet addCell(new Label(cell getColumn() cell getRow()
(String) newValue new jxl write WritableCellFormat(cell
getCellFormat())))
} else {
throw new Exception( 不支持的其它单元格类型 + type)
// System err println( 不支持的其它单元格类型 + cell getType() + at +
// cell getColumn() + + cell getRow() + current content: +
// cell getContents())
}
}
lishixinzhi/Article/program/Java/hx/201311/25570这样的效果相当于在两列的title栏交界处双击.不过api里我确实没查到这个功能------解决方案--------------------------------------------------------你可以先判断这一列字符最多的单元格,再进行相应的设置------解决方案--------------------------------------------------------哈哈! 哥们 以前 我遇到 过这样的 问题~ 你点子 很正 .报表 样式 是 :----------------------| aaaaaaa |----------------------|aaaa| bbbbbb |cccc |----------------------因为当时 项目 要搞 自动化 , 实现 方式 是 :1 . 读取 xml 配置文件2 . 建立 Excel 模版 ( 只划剃头 和样式 ,这个文件是临时的)3 . 读取 Excel 模版 ,使用 jxl 写数据,保存到 ServletOutputStream4 . 删除Excel 模版所以 我当时 处理 上面 格式 代码是这样写的for (int i = 0i <columnNumi++) {sheet.setColumnView(i, maxColumnLehgth * 3)}意思是 : 只要你在 下面 的 那三个 cell 设置 的 长度 都相同 , 那么 就 可以 实现. 否则有一个 长度不一样 ,那么 样式 就全乱了 .我现在想这么做.就是取到最大的长度,然后根据最大的长度进行setColumnView()但是我的循环好像出了问题
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)