java与xsl样式表

Python015

java与xsl样式表,第1张

XSL提供两种机制来联合样式表:

1.样式表导入,允许样式表之间相互引用

2.样式表包含,允许样式表被原文组合.

样式表导入

一个XSL样式表可以包含xsl:import元素.所有xsl:import元素必须出现在样式表的开头. xsl:import元素有一个 href 属性,它的值就表示要导入的样式表的URI. 相对URI是指相对于xsl:import元素的基URI.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:import href="article.xsl"/>

<xsl:import href="bigfont.xsl"/>

<xsl:define-attribute-set name="note-style">

<xsl:attribute-set font-posture="italic"/>

</xsl:define-attribute-set>

</xsl:stylesheet>

导向的样式表中的规则和定义比任何被导入样式表中的规则和定义都要重要.同样,一被导入的样式表中的规则和定义比之前导入的样式表中的规则和定义都要重要.一般来说,更重要的规则或定义比次重要的规则或定义要优先.每一类的规则和定义都会详细规定它.

样式表包含

一个样式表中可以用xsl:include元素来包含另一个XSL样式表. xsl:include也有href 属性,它的值就表示被包含的样式表的URI. 相对URI是指相对于xsl:include元素的基URI. xsl:include元素可以作为xsl:stylesheet元素的子元素,出现在任何xsl:import之后.在XML树的层次在上该包含生效.由href属性值定位的资源内容作为一个XML文档解析,在该文档中的xsl:stylesheet元素的子元素替代包含文档的xsl:include元素.同时在被包含的文档的xsl:import元素在包含文档中移上至任一存在的xsl:import元素之后. 不象xsl:import,被包含的规则或定义不影响他们被处理的方式.

嵌入样式表

通常一个样式表就是一个完整的XML文档,xsl:stylesheet元素作为文档的元素. 然而一个XSL样式表也可以嵌入在其它文档内容之中.内嵌的方式可能有两种:XSL样式表可以原文嵌入在一个非XML文档中或者xsl:stylesheet不作为文档元素出现在一个XML文档中.在第二种情况增加了出现内嵌样式,即自己规定样式的文档的可能. XSL还没有为之定义相应的机制.这是由于可以采用把样式表结合文档的通用方式来实现,只要满足:

1. 该方式允许一部分内容可以规定为样式表,例如使用有片段标识符URI

2. 该方式本身能被嵌入在文档中, 比如作为一个处理指令.定义这样的方式不在XSL的范围之内.

下例表明了怎样用xml:stylesheet处理指令将样式表和文档结合来实现内嵌样式. 其中的URI在片段标识符中使用了一个Xpointer来确定xsl:stylesheet元素的位置.

<?xml version="1.0"?>

<?xml:stylesheet type="text/xsl" href="#id(style1)"?>

<!DOCTYPE doc SYSTEM "doc.dtd">

<doc>

<head>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" id="style1">

<xsl:import href="doc.xsl"/>

<xsl:template match="id(foo)">

<fo:block font-weight="bold"><xsl:process-children/></fo:block>

</xsl:template>

</xsl:stylesheet>

</head>

<body>

<para id="foo">

...

</para>

</body>

</doc>

写入文件:

String filepathWrite = "d:\\baidu.xlsx"

FileOutputStream fileOut = new FileOutputStream(filepathWrite)

wbWrite.write(fileOut)

fileOut.close()

System.out.println("写入成功!")

is.close()

} catch (Exception e2) {

// TODO: handle exception

e2.printStackTrace()

}

}

本例使用java来读取excel的内容并展出出结果,代码如下:

复制代码 代码如下:

import java.io.BufferedInputStream

import java.io.File

import java.io.FileInputStream

import java.io.FileNotFoundException

import java.io.IOException

import java.text.DecimalFormat

import java.text.SimpleDateFormat

import java.util.ArrayList

import java.util.Arrays

import java.util.Date

import java.util.List

import org.apache.poi.hssf.usermodel.HSSFCell

import org.apache.poi.hssf.usermodel.HSSFDateUtil

import org.apache.poi.hssf.usermodel.HSSFRow

import org.apache.poi.hssf.usermodel.HSSFSheet

import org.apache.poi.hssf.usermodel.HSSFWorkbook

import org.apache.poi.poifs.filesystem.POIFSFileSystem

public class ExcelOperate {

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

File file = new File("ExcelDemo.xls")

String[][] result = getData(file, 1)

int rowLength = result.length

for(int i=0i<rowLengthi++) {

for(int j=0j<result[i].lengthj++) {

System.out.print(result[i][j]+"\t\t")

}

System.out.println()

}

}

/**

* 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行

* @param file 读取数据的源Excel

* @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1

* @return 读出的Excel中数据的内容

* @throws FileNotFoundException

* @throws IOException

*/

public static String[][] getData(File file, int ignoreRows)

throws FileNotFoundException, IOException {

List<String[]>result = new ArrayList<String[]>()

int rowSize = 0

BufferedInputStream in = new BufferedInputStream(new FileInputStream(

file))

// 打开HSSFWorkbook

POIFSFileSystem fs = new POIFSFileSystem(in)

HSSFWorkbook wb = new HSSFWorkbook(fs)

HSSFCell cell = null

for (int sheetIndex = 0sheetIndex <wb.getNumberOfSheets()sheetIndex++) {

HSSFSheet st = wb.getSheetAt(sheetIndex)

// 第一行为标题,不取

for (int rowIndex = ignoreRowsrowIndex <= st.getLastRowNum()rowIndex++) {

HSSFRow row = st.getRow(rowIndex)

if (row == null) {

continue

}

int tempRowSize = row.getLastCellNum() + 1

if (tempRowSize >rowSize) {

rowSize = tempRowSize

}

String[] values = new String[rowSize]

Arrays.fill(values, "")

boolean hasValue = false

for (short columnIndex = 0columnIndex <= row.getLastCellNum()columnIndex++) {

String value = ""

cell = row.getCell(columnIndex)

if (cell != null) {

// 注意:一定要设成这个,否则可能会出现乱码

cell.setEncoding(HSSFCell.ENCODING_UTF_16)

switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:

value = cell.getStringCellValue()

break

case HSSFCell.CELL_TYPE_NUMERIC:

if (HSSFDateUtil.isCellDateFormatted(cell)) {

Date date = cell.getDateCellValue()

if (date != null) {

value = new SimpleDateFormat("yyyy-MM-dd")

.format(date)

} else {

value = ""

}

} else {

value = new DecimalFormat("0").format(cell

.getNumericCellValue())

}

break

case HSSFCell.CELL_TYPE_FORMULA:

// 导入时如果为公式生成的数据则无值

if (!cell.getStringCellValue().equals("")) {

value = cell.getStringCellValue()

} else {

value = cell.getNumericCellValue() + ""

}

break

case HSSFCell.CELL_TYPE_BLANK:

break

case HSSFCell.CELL_TYPE_ERROR:

value = ""

break

case HSSFCell.CELL_TYPE_BOOLEAN:

value = (cell.getBooleanCellValue() == true ? "Y"

: "N")

break

default:

value = ""

}

}

if (columnIndex == 0 &&value.trim().equals("")) {

break

}

values[columnIndex] = rightTrim(value)

hasValue = true

}

if (hasValue) {

result.add(values)

}

}

}

in.close()

String[][] returnArray = new String[result.size()][rowSize]

for (int i = 0i <returnArray.lengthi++) {

returnArray[i] = (String[]) result.get(i)

}

return returnArray

}

/**

* 去掉字符串右边的空格

* @param str 要处理的字符串

* @return 处理后的字符串

*/

public static String rightTrim(String str) {

if (str == null) {

return ""

}

int length = str.length()

for (int i = length - 1i >= 0i--) {

if (str.charAt(i) != 0x20) {

break

}

length--

}

return str.substring(0, length)

}

}