在有些要求当中大家须要抓取字段并且填充到excel表格里面,最后将excel表格转换成pdf格式举办输出,我先是次接触这一个要求时,境遇多少个相比较棘手的题材,现在种种列出并且提供解决方案。

java读取各项目标文书

用到的多少个包

bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene-core-2.0.0.jar/PDFBox-0.7.3.jar/poi-3.0-alpha3-20061212.jar/poi-contrib-3.0-alpha3-20061212.jar/poi-scratchpad-3.0-alpha3-20061212.jar

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.TextRun;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.util.PDFTextStripper;

public class Test {

/**
* @param args
*/
public static void p(Object obj) {
   System.out.println(obj);
}

public static void main(String[] args) {
   try {
    p(readPpt(“src/1.dps”));
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

}
//读取ppt
public static String readPpt(String path) throws Exception {

   StringBuffer content = new StringBuffer(“”);
   try {
    SlideShow ss = new SlideShow(new HSLFSlideShow(path));//
path为文件的全路径名称,建立SlideShow
    Slide[] slides = ss.getSlides();// 得到每一张幻灯片
    for (int i = 0; i < slides.length; i++) {
     TextRun[] t = slides[i].getTextRuns();//
为了获取幻灯片的文字内容,建立TextRun
     for (int j = 0; j < t.length; j++) {
      content.append(t[j].getText());//
那里会将文字内容加到content中去
     }
     content.append(slides[i].getTitle());
    }
   } catch (Exception ex) {
    System.out.println(ex.toString());
   }
   return content.toString().trim();

}
// 读取xls
public static String readXls(String path) throws Exception {
   StringBuffer content = new StringBuffer(“”);// 文档内容
   HSSFWorkbook workbook = new HSSFWorkbook(new
FileInputStream(path));
   int sheetCount = workbook.getNumberOfSheets();// excel几张表
   for (int i = 0; i < sheetCount; i++) {// 遍历excel表
    HSSFSheet sheet = workbook.getSheetAt(i);// 对excel的首个表引用
    int rowCount = sheet.getLastRowNum();// 取得最后一行的下标
    for (int j = 0; j < rowCount; j++) {// 循环每一行
     HSSFRow row = sheet.getRow(j);// 引用行
     if (row == null) {
      continue;
     } else {
      short cellNum = row.getLastCellNum();
      for (short m = 0; m < cellNum; m++) {
       HSSFCell cell = row.getCell(m);// 引用行中的一个单元格
       if (cell != null) {
        int cellType = cell.getCellType();
        // CELL_TYPE_NUMERIC 0 数字
拷贝到另一个Excel文件中,Java汉字转拼音操作工具类。        // CELL_TYPE_STRING 1 字符串
        // CELL_TYPE_FORMULA 2 公式
        // CELL_TYPE_BLANK 3 空格
        // CELL_TYPE_BOOLEAN 4 布尔值
        // CELL_TYPE_ERROR 5 错误
        switch (cellType) {
        // 单元格类型为数字
        case HSSFCell.CELL_TYPE_NUMERIC:
         // 取数字单元格的值
         double d = cell.getNumericCellValue();
         content.append(String.valueOf(d) + ”   “);
         break;
        // 单元格类型为字符串
        case HSSFCell.CELL_TYPE_STRING:
         String str = cell.getStringCellValue().trim();
         if (!str.equals(“”)) {
          content.append(str + ”   “);
         }
         break;
        // 单元格类型为公式
        case HSSFCell.CELL_TYPE_FORMULA:
澳门金沙国际,         // 不读取公式
         // String formula = cell.getCellFormula();
         // content = content + formula+” “;
         break;
        // 单元格类型为空白
        case HSSFCell.CELL_TYPE_BLANK:
         break;
        // 单元格类型为布尔值
        case HSSFCell.CELL_TYPE_BOOLEAN:
         // boolean bool = cell.getBooleanCellValue();
         // content = content + bool+” “;
         break;
        // 单元格类型为错误
        case HSSFCell.CELL_TYPE_ERROR:
         // byte errorCode = cell.getErrorCellValue();
         // content = content + errorCode+” “;
         break;
        default:
         break;
        }
       } else {
        // content = content + “…” +”
“;//没有多少的单元格使用…填充
       }
      }
     }
     content.append(“\r”);
    }
   }
   return content.toString().trim();
}

// 读取pdf
public static String readPdf(String path) throws Exception {
   StringBuffer content = new StringBuffer(“”);// 文档内容
   FileInputStream fis = new FileInputStream(path);
   PDFParser p = new PDFParser(fis);
   p.parse();
   PDFTextStripper ts = new PDFTextStripper();
   content.append(ts.getText(p.getPDDocument()));
   fis.close();
   return content.toString().trim();
}

// 读取word,只可以读取文本内容 图片不行
public static String readWord(String path) throws Exception {

   StringBuffer content = new StringBuffer(“”);// 文档内容
   HWPFDocument doc = new HWPFDocument(new FileInputStream(path));
   Range range = doc.getRange();
   int paragraphCount = range.numParagraphs();// 段落
   for (int i = 0; i < paragraphCount; i++) {// 遍历段落读取数据
    Paragraph pp = range.getParagraph(i);
    content.append(pp.text());
   }
   return content.toString().trim();
}

// 读取text
public static String readTxt(String path) {
   StringBuffer content = new StringBuffer(“”);// 文档内容
   try {
    FileReader reader = new FileReader(path);
    BufferedReader br = new BufferedReader(reader);
    String s1 = null;

    while ((s1 = br.readLine()) != null) {
     content.append(s1 + “\r”);
    }
    br.close();
    reader.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   return content.toString().trim();
}

}

public class CopyExcelSheetToAnotherExcelSheet {

package org.powerSystem.util;

1:excel转pdf现身乱码:

  public static void main(String[] args) throws
FileNotFoundException, IOException {
    String fromPath = “D:\\share\\jiemu_new\\”;//
excel存放路径
    String toPath = “c:\\ok\\”;// 保存新EXCEL路径
    // 新的excel 文件名
    String excelName = “节目访问量”;
    // 创造新的excel
    HSSFWorkbook wbCreat = new HSSFWorkbook();
    File file = new File(fromPath);
    for (File excel : file.listFiles()) {
      // 打开已有的excel
      String strExcelPath = fromPath + “\\” + excel.getName();
      InputStream in = new FileInputStream(strExcelPath);
      HSSFWorkbook wb = new HSSFWorkbook(in);
      for (int ii = 0; ii < wb.getNumberOfSheets(); ii++) {
        HSSFSheet sheet = wb.getSheetAt(ii);
        HSSFSheet sheetCreat =
wbCreat.createSheet(sheet.getSheetName());
        // 复制源表中的合并单元格
        MergerRegion(sheetCreat, sheet);
        int firstRow = sheet.getFirstRowNum();
        int lastRow = sheet.getLastRowNum();
        for (int i = firstRow; i <= lastRow; i++) {
          // 创立新建excel Sheet的行
          HSSFRow rowCreat = sheetCreat.createRow(i);
          // 取得源有excel Sheet的行
          HSSFRow row = sheet.getRow(i);
          // 单元格式样
          int firstCell = row.getFirstCellNum();
          int lastCell = row.getLastCellNum();
          for (int j = firstCell; j < lastCell; j++) {
            // 自动适应列宽 貌似不起作用
            //sheetCreat.autoSizeColumn(j);
            System.out.println(row.getCell(j));
            rowCreat.createCell(j);
            String strVal =””;
            if (row.getCell(j)==null) {
             
            }else{
              strVal =
removeInternalBlank(row.getCell(j).getStringCellValue());
            }
            rowCreat.getCell(j).setCellValue(strVal);
          }
        }
      }
    }
    FileOutputStream fileOut = new FileOutputStream(toPath + excelName

import net.sourceforge.pinyin4j.PinyinHelper;

    第两回excel转pdf是成功的,第二次开头后边皆是乱码,是因为自身的pdf转excel方法出现的问题,解决办法是行使java自身底层的主意(详见下方代码)。

  • “.xls”);
        wbCreat.write(fileOut);
        fileOut.close();
      }

import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;

 public static boolean getLicense()
{
        boolean result = false;
        try {
            InputStream is =
Thread.currentThread().getContextClassLoader()
                  
 .getResourceAsStream(“license.xml”); // 
license.xml应放在..\WebRoot\WEB-INF\classes路径下
            License aposeLic = new
License();
           
aposeLic.setLicense(is);
            result = true;
        } catch (Exception e)
{               
            e.printStackTrace();
        }
        return result;
    }
    
    
    public static void
excelTransferPdf(String excelPath,String pdfPath) {
        if (!getLicense()) {
            System.out.println(“license
faile”);
            return;
        }
        
        try {     
            Workbook wb = new
Workbook(excelPath);
            FileOutputStream fileOS = new
FileOutputStream(new File(pdfPath));
            wb.save(fileOS,
com.aspose.cells.SaveFormat.PDF);
            fileOS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  /**
  * 复制原有sheet的联结单元格到新成立的sheet
  *
  * @param sheetCreat
  *      新创建sheet
  * @param sheet
  *      原有的sheet
  */
  private static void MergerRegion(HSSFSheet sheetCreat, HSSFSheet
sheet) {
    int sheetMergerCount = sheet.getNumMergedRegions();
    for (int i = 0; i < sheetMergerCount; i++) {
      Region mergedRegionAt = sheet.getMergedRegionAt(i);
      sheetCreat.addMergedRegion(mergedRegionAt);
    }

import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;

2:excel转pdf出现折行。

  }

import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

  excel转pdf出现折行的意况非平时见,因为在程序运行进程中广大字段是抓取的,你不可以断定你的excel转成pdf会有几页,所以那个时候你就绝不轻易设置excel的预览格式,将excel的单元格式设置自动换行。

  /**
  * 去除字符串内部空格
  */
  public static String removeInternalBlank(String s) {
    // System.out.println(“bb:” + s);
    Pattern p = Pattern.compile(“\\s*|\t|\r|\n”);
    Matcher m = p.matcher(s);
    char str[] = s.toCharArray();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < str.length; i++) {
      if (str[i] == ‘ ‘) {
        sb.append(‘ ‘);
      } else {
        break;
      }
    }
    String after = m.replaceAll(“”);
    return sb.toString() + after;
  }
}

import
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

3:抓取字段展现结果不完整:。

/**

  当您未设置单元格大小而又没有安装单元格自动换行,比如你的A18单元格里面的字段当先了单元格的长度你还平素不安装单元格大小而又从不安装单元格自动换行,就将抓取的字段填充在B18单元格里面,那么打印出来的pdf文件A18单元格超出单元出色的情节是满不在乎呈现的,此时您要么将抓取字段填充在C18单元格内要么将更改A18单元格格式

* java汉字转拼音操作工具类

4:excel转PDF字段内容无故中间有些换行:

*

  那是自我遭遇的最坑的一个地点,那一个时候你只要求在excel单元格里面安装自动换行即可,无需代码强行自动换行(强行换行有可能只出现多行数据只突显一行)。同时您必要如下代码:

* @author sunlightcs

/**
     *
获得一个字符串的尺寸,突显的尺寸,一个中国字或日丹麦语长度为1,英文字符长度为0.5
     *
     * @param String
     *            s 需求获得长度的字符串
     * @return int 得到的字符串长度
     */
    public static double getLength(String s) {
        double valueLength = 0;
        if (s == null) {
            return 0;
        }
        String chinese = “[\u4e00-\u9fa5]”;
        //
获取字段值的长度,要是含粤语字符,则每个普通话字符长度为2,否则为1
        for (int i = 0; i < s.length(); i++) {
            // 获取一个字符
            String temp = s.substring(i, i + 1);
            // 判断是还是不是为华语字符
            if (temp.matches(chinese)) {
                // 中文字符长度为2
                valueLength += 2;
            } else {
                // 其余字符长度为1
                valueLength += 1;
            }
        }
        // 进位取整
        return Math.ceil(valueLength);
    }

*

    /**
     * 根据字符串长度获取行高
     *
     * @param str
     * @return
     */
    public static Float getRowHeight(String str) {

*/

        Integer lineCount = (int) (getLength(str) / 64) + 1;
        if (str.contains(“\n”)) {
            Integer tempLineCount = 1;
            String[] lines = str.split(“\n”);
            for (String line : lines) {
                Integer everyLineCount = (int) (getLength(line) / 64) +
1;
                tempLineCount += everyLineCount;
            }
            lineCount = lineCount >= tempLineCount ? lineCount :
tempLineCount;
        }
        Float rowHeight = (float) (lineCount * 20);
        return rowHeight;
    }

public class PinyingUtil {

您须要先获得抓取的字符串的长短,然后经过那个方式统计行高,再将excel需要填写的该行用Java代码设置行高(行高单位是像素),不过假使出现本身上边说的字段内容无故中间部分换行,那么你收获的行高就会相差,那一个时候你要求转移这一个地点—–>>>>Float rowHeight = (float) (lineCount * X); 
x的值一定要设置的大一行,以防出现那种意况!

/**

 

* 将字符串转换成拼音数组

*

* @param src

* @return

*/

public static String[] stringToPinyin(String src) {

return stringToPinyin(src, false, null);

}

/**

* 将字符串转换成拼音数组

*

* @param src

* @return

*/

public static String[] stringToPinyin(String src, String separator) {

return stringToPinyin(src, true, separator);

}

/**

* 将字符串转换成拼音数组

*

* @param src

* @param isPolyphone

*            是不是意识到多音字的有所拼音

* @param separator

*            多音字拼音之间的相间符

* @return

*/

public static String[] stringToPinyin(String src, boolean isPolyphone,

String separator) {

// 判断字符串是还是不是为空

if (“”.equals(src) || null == src) {

return null;

}

char[] srcChar = src.toCharArray();

int srcCount = srcChar.length;

String[] srcStr = new String[srcCount];

for (int i = 0; i < srcCount; i++) {

srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);

}

return srcStr;

}

/**

* 将单个字符转换成拼音

*

* @param src

* @return

*/

public static String charToPinyin(char src, boolean isPolyphone,

String separator) {

// 创立汉语拼音处理类

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();

// 输出设置,大小写,音标格局

defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

StringBuffer tempPinying = new StringBuffer();

// 倘若是汉语

if (src > 128) {

try {

// 转换得出结果

String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,

defaultFormat);

// 是还是不是意识到多音字,默认是意识到多音字的率先个字符

if (isPolyphone && null != separator) {

for (int i = 0; i < strs.length; i++) {

tempPinying.append(strs[i]);

if (strs.length != (i + 1)) {

// 多音字之间用特殊符号间隔起来

tempPinying.append(separator);

}

}

} else {

tempPinying.append(strs[0]);

}

} catch (BadHanyuPinyinOutputFormatCombination e) {

e.printStackTrace();

}

} else {

tempPinying.append(src);

}

return tempPinying.toString();

}

public static String hanziToPinyin(String hanzi) {

return hanziToPinyin(hanzi, ” “);

}

/**

* 将汉字转换成拼音

*

* @param hanzi

* 汉字

* @param separator

* 汉字转拼音后的区间符号

* @return

*/

@SuppressWarnings(“deprecation”)

public static String hanziToPinyin(String hanzi, String separator) {

// 创造中文拼音处理类

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();

// 输出设置,大小写,音标格局

defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

String pinyingStr = “”;

try {

pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat,

separator);

} catch (BadHanyuPinyinOutputFormatCombination e) {

e.printStackTrace();

}

return pinyingStr;

}

/**

* 将字符串数组转换成字符串

*

* @param str

* @param separator

*            各种字符串之间的相间符

* @return

*/

public static String stringArrayToString(String[] str, String
separator) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < str.length; i++) {

sb.append(str[i]);

if (str.length != (i + 1)) {

sb.append(separator);

}

}

return sb.toString();

}

/**

* 简单的将逐一字符数组之间连接起来

*

* @param str

* @return

*/

public static String stringArrayToString(String[] str) {

return stringArrayToString(str, “”);

}

/**

* 将字符数组转换成字符串

*

* @param str

* @param separator

*            各类字符串之间的相间符

* @return

*/

public static String charArrayToString(char[] ch, String separator) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < ch.length; i++) {

sb.append(ch[i]);

if (ch.length != (i + 1)) {

sb.append(separator);

}

}

return sb.toString();

}

/**

* 将字符数组转换成字符串

*

* @param str

* @return

*/

public static String charArrayToString(char[] ch) {

return charArrayToString(ch, ” “);

}

/**

* 取汉字的首字母

*

* @param src

* @param isCapital

*            是不是是大写

* @return

*/

public static char[] getHeadByChar(char src, boolean isCapital) {

// 就算不是汉字直接重返

if (src <= 128) {

return new char[] { src };

}

// 获取具有的拼音

String[] pinyingStr = PinyinHelper.toHanyuPinyinStringArray(src);

// 创制重临对象

int polyphoneSize = pinyingStr.length;

char[] headChars = new char[polyphoneSize];

int i = 0;

// 截取首字符

for (String s : pinyingStr) {

char headChar = s.charAt(0);

// 首字母是还是不是大写,默许是小写

if (isCapital) {

headChars[i] = Character.toUpperCase(headChar);

} else {

headChars[i] = headChar;

}

i++;

}

return headChars;

}

/**

* 取汉字的首字母(默许是大写)

*

* @param src

* @return

*/

public static char[] getHeadByChar(char src) {

return getHeadByChar(src, true);

}

/**

* 查找字符串首字母

*

* @param src

* @return

*/

public static String[] getHeadByString(String src) {

return getHeadByString(src, true);

}

/**

* 查找字符串首字母

*

* @param src

* @param isCapital

*            是还是不是大写

* @return

*/

public static String[] getHeadByString(String src, boolean isCapital)
{

return getHeadByString(src, isCapital, null);

}

/**

* 查找字符串首字母

*

* @param src

* @param isCapital

*            是还是不是大写

* @param separator

*            分隔符

* @return

*/

public static String[] getHeadByString(String src, boolean isCapital,

String separator) {

char[] chars = src.toCharArray();

String[] headString = new String[chars.length];

int i = 0;

for (char ch : chars) {

char[] chs = getHeadByChar(ch, isCapital);

StringBuffer sb = new StringBuffer();

if (null != separator) {

int j = 1;

for (char ch1 : chs) {

sb.append(ch1);

if (j != chs.length) {

sb.append(separator);

}

j++;

}

} else {

sb.append(chs[0]);

}

headString[i] = sb.toString();

i++;

}

return headString;

}

public static void main(String[] args) {

System.out.println(hanziToPinyin(null,””));

}

}

相关文章