不知你有没有学习javaWeb的东西,如果学过那你应该会用,主要就servlet,struct2等从后台取到数据在页面显示。这些的前提是你必须要有一个web的服务器,前台页面从服务器中的后台任务获取数据,进行展示。如果没学过javaWeb那就先学习一下吧,一个月的时间学servlet很足够。
java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估
计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过, *** 作
方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关
于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO *** 作外加编码转换即可。rtf格式文件表
面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。
----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。
----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。
1、采用字节的形式读取rtf模板内容
2、将可变的内容字符串转为rtf编码
3、替换原文中的可变部分,形成新的rtf文档
主要程序如下:
public String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF"toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = bingetBytes();
int bit;
for (int i = 0; i < bslength;i++) {
bit = (bs[i] & 0x0f0)
>> 4;
sbappend("\\'");
sbappend(digital[bit]);
bit = bs[i] & 0x0f;
sbappend(digital[bit]);
}
return sbtoString();
}
public String readByteRtf(InputStream ins, String path){
String sourcecontent =
"";
try{
ins = new
FileInputStream(path);
byte[] b
= new byte[1024];
if (ins == null) {
Systemoutprintln("源模板文件不存在");
}
int bytesRead = 0;
while (true) {
bytesRead = insread(b, 0, 1024); // return final read bytes
counts
if(bytesRead == -1) {// end of InputStream
Systemoutprintln("读取模板文件结束");
break;
}
sourcecontent += new String(b, 0, bytesRead); // convert to string
using bytes
}
}catch(Exception e){
eprintStackTrace();
}
return sourcecontent ;
}
以上为核心代码,剩余部分就是替换,从新组装java中的Stringreplace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。
运行源代码前提:
c盘创建YQ目录,将附件中"模板rtf"复制到YQ目录之下,运行OpreatorRTFjava文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录rtf
的文件。
package com;
import javaioFile;
import javaioFileInputStream;
import javaioFileWriter;
import javaioIOException;
import javaioInputStream;
import javaioPrintWriter;
import javatextSimpleDateFormat;
import javautilDate;
public class OperatorRTF {
public String strToRtf(String content){
char[] digital = "0123456789ABCDEF"toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = contentgetBytes();
int bit;
for (int i = 0; i < bslength; i++) {
bit = (bs[i] & 0x0f0)
>> 4;
sbappend("\\'");
sbappend(digital[bit]);
bit = bs[i] & 0x0f;
sbappend(digital[bit]);
}
return sbtoString();
}
public String replaceRTF(String content,String replacecontent,int
flag){
String rc = strToRtf(replacecontent);
String target = "";
if(flag==0){
target = contentreplace("$timetop$",rc);
}
if(flag==1){
target = contentreplace("$info$",rc);
}
if(flag==2){
target = contentreplace("$idea$",rc);
}
if(flag==3){
target = contentreplace("$advice$",rc);
}
if(flag==4){
target = contentreplace("$infosend$",rc);
}
return target;
}
public String getSavePath() {
String path = "C:\\YQ";
File fDirecotry = new File(path);
if (!fDirecotryexists()) {
fDirecotrymkdirs();
}
return path;
}
public String ToSBC(String input){
char[] c =
inputtoCharArray();
for (int i =
0; i < clength; i++){
if (c[i] == 32){
c[i] = (char) 12288;
continue;
}
if (c[i] < 127){
c[i] = (char) (c[i] + 65248);
}
}
return new
String(c);
}
public void rgModel(String username, String content) {
// TODO Auto-generated method stub
Date current=new Date();
SimpleDateFormat sdf=new javatextSimpleDateFormat("yyyy-MM-dd
HH:mm:ss");
String targetname = sdfformat(current)substring(11,13) + "时";
targetname += sdfformat(current)substring(14,16) + "分";
targetname += sdfformat(current)substring(17,19) + "秒";
targetname += "_" + username +"_记录rtf";
String strpath = getSavePath();
String sourname = strpath+"\\"+"模板rtf";
String sourcecontent = "";
InputStream ins = null;
try{
ins = new FileInputStream(sourname);
byte[] b = new byte[1024];
if (ins == null) {
Systemoutprintln("源模板文件不存在");
}
int bytesRead = 0;
while (true) {
bytesRead = insread(b, 0, 1024); // return final read bytes
counts
if(bytesRead == -1) {// end of InputStream
Systemoutprintln("读取模板文件结束");
break;
}
sourcecontent += new String(b, 0, bytesRead); // convert to string
using bytes
}
}catch(Exception e){
eprintStackTrace();
}
String targetcontent = "";
String array[] = contentsplit("~");
for(int i=0;i<arraylength;i++){
if(i==0){
targetcontent = replaceRTF(sourcecontent, array[i], i);
}else{
targetcontent = replaceRTF(targetcontent, array[i], i);
}
}
try {
FileWriter fw = new FileWriter(getSavePath()+"\\" +
targetname,true);
PrintWriter out = new PrintWriter(fw);
if(targetcontentequals("")||targetcontent==""){
outprintln(sourcecontent);
}else{
outprintln(targetcontent);
}
outclose();
fwclose();
Systemoutprintln(getSavePath()+" 该目录下生成文件" +
targetname + " 成功");
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OperatorRTF oRTF = new OperatorRTF();
String content =
"2008年10月12日9时-2008年10月12日6时~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法";
oRTFrgModel("cheney",content);
}
}
import javaioBufferedReader;
import javaioFile;
import javaioFileNotFoundException;
import javaioFileReader;
import javaioIOException;
import javautilArrayList;
import jxlSheet;
import jxlWorkbook;
import jxlreadbiffBiffException;
public static ArrayList<String> readTelExcel(String filepath) {
try {
//查询文件是否存在
File file = new File(filepath);
if (fileexists()) {
ArrayList<String> result = new ArrayList<String>();
//声明一个excel文件对象
Workbook wb = WorkbookgetWorkbook(file);
//读取每一个工作薄,你也可能用wbgetSheets()得到全部工作薄
Sheet ws = wbgetSheet(0);
if (null != ws) {
//取出所有行
int rows = wsgetRows();
for (int i = 0; i < rows; i++) {
//读取第一列中的内容
String cell = wsgetCell(0, i)getContents();
if (null != cell) {
resultadd(celltrim());
}
}
}
return result;
}
return null;
} catch (BiffException e) {
eprintStackTrace();
return null;
} catch (IndexOutOfBoundsException e) {
eprintStackTrace();
return null;
} catch (IOException e) {
eprintStackTrace();
return null;
}
}
获取文件类型,一般的是列出目前所有的文件类型,根据表头进行相应判断,示例如下:
/件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。
头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。
为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下:
Java代码 :
/
package comyonyousudfile;
import javaioFileInputStream;
import javaioIOException;
import javautilHashMap;
/
获取和判断文件头信息
@author Sud
/
public class GetTypeByHead {
//缓存文件头信息-文件头信息
public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();
static {
// images
mFileTypesput("FFD8FF", "jpg");
mFileTypesput("89504E47", "png");
mFileTypesput("47494638", "gif");
mFileTypesput("49492A00", "tif");
mFileTypesput("424D", "bmp");
//
mFileTypesput("41433130", "dwg"); // CAD
mFileTypesput("38425053", "psd");
mFileTypesput("7B5C727466", "rtf"); // 日记本
mFileTypesput("3C3F786D6C", "xml");
mFileTypesput("68746D6C3E", "html");
mFileTypesput("44656C69766572792D646174653A", "eml"); // 邮件
mFileTypesput("D0CF11E0", "doc");
mFileTypesput("5374616E64617264204A", "mdb");
mFileTypesput("252150532D41646F6265", "ps");
mFileTypesput("255044462D312E", "pdf");
mFileTypesput("504B0304", "docx");
mFileTypesput("52617221", "rar");
mFileTypesput("57415645", "wav");
mFileTypesput("41564920", "avi");
mFileTypesput("2E524D46", "rm");
mFileTypesput("000001BA", "mpg");
mFileTypesput("000001B3", "mpg");
mFileTypesput("6D6F6F76", "mov");
mFileTypesput("3026B2758E66CF11", "asf");
mFileTypesput("4D546864", "mid");
mFileTypesput("1F8B08", "gz");
}
/
根据文件路径获取文件头信息
@param filePath
文件路径
@return 文件头信息
/
public static String getFileType(String filePath){
Systemoutprintln(getFileHeader(filePath));
Systemoutprintln(mFileTypesget(getFileHeader(filePath)));
return mFileTypesget(getFileHeader(filePath));
}
/
根据文件路径获取文件头信息
@param filePath
文件路径
@return 文件头信息
/
public static String getFileHeader(String filePath){
FileInputStream is = null;
String value = null;
try {
is = new FileInputStream(filePath);
byte[] b = new byte[4];
/int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 blength 个字节的数据读入一个 byte 数组中。
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
/
isread(b, 0, blength);
value = bytesToHexString(b);
} catch (Exception e){
} finally {
if (null != is){
try {
isclose();
} catch (IOException e){
}
}
}
return value;
}
/
将要读取文件头信息的文件的byte数组转换成string类型表示
@param src
要读取文件头信息的文件的byte数组
@return 文件头信息
/
private static String bytesToHexString(byte[] src){
StringBuilder builder = new StringBuilder();
if (src == null || srclength <= 0){
return null;
}
String hv;
for (int i = 0; i < srclength; i++){
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
hv = IntegertoHexString(src[i] & 0xFF)toUpperCase();
if (hvlength() < 2){
builderappend(0);
}
builderappend(hv);
}
Systemoutprintln(buildertoString());
return buildertoString();
}
public static void main(String[] args)throws Exception {
final String fileType = getFileType("E:/Java编程思想读书笔记docx");
Systemoutprintln(fileType);
}
}
楼主你好,首先你检测一下你的word是否正常,方法是:点开始,再点运行,输入winword /safe(注意,/前面有一个空格),看看是否能打开word,如果可以,那么word是正常的,没有问题。那么楼主打不开word可能是通用模板的问题了,通用模板的具体路径为:C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates,把这个文件夹下的内容全部彻底删除,然后再去打开word,它会自动生成一个默认的通用模板,问题应该就能解决了!
用jacob吧。。
/
@author eyuan
/
package pereyuanword2txtcore;
import comjacob;
import comjacobcom;
import comjacobactiveX;
import javaio;
import javautilScanner;
public class Core {
/
实现转换的函数
@param sourceFilesPath
@param destinationFilesPath
@param destinationFilesType
@return void
@see import comjacobactiveX;
/
public static void change(String sourceFilesPath,String destinationFilesPath,int destinationFilesType){
//使用word文件所在的目录(源路径)建立目录文件
File sourcePathFile=new File(sourceFilesPath);
//取得word文件(源文件列表)
File sourceFilesList[]=sourcePathFilelistFiles();
Systemoutprintln("共有"+sourceFilesListlength+"个文件(文件夹)");
//指定要转换的文件所在的目录下,如果有子目录,
//则进入子目录,继续查找word文档并将其转换,
//直到将指定目录下的所有word文档转换完。
//子目录名
String sourceChildPath=new String("");
//保持原来的层次关系,将子目录下的文件存放在新建的子目录中
String destiNationChildPath=new String("");
//检索文件,过滤掉非word文件,通过扩展名过滤
for(int i=0;i<sourceFilesListlength;i++){
//排除掉子文件夹
if(sourceFilesList[i]isFile()){
Systemoutprintln("第"+(i+1)+"个文件:");
//取得文件全名(包含扩展名)
String fileName=sourceFilesList[i]getName();
String fileType=new String("");
//取得文件扩展名
fileType=fileNamesubstring((fileNamelength()-4), fileNamelength());
//word2007-2010扩展名为docx
//判断是否为word2007-2010文档,及是否以docx为后缀名
if(fileTypeequals("docx")){
Systemoutprintln("正在转换。。。");
//输出word文档所在路劲
Systemoutprintln("目录:"+sourceFilesPath);
//输出word文档名
Systemoutprintln("文件名:"+fileName);
//Systemoutprintln(fileNamesubstring(0, (fileNamelength()-5)));
//核心函数
//启动word
ActiveXComponent app=new ActiveXComponent("WordApplication");
//要转换的文档的全路径(所在文件夹+文件全名)
String docPath=sourceFilesPath+"\\"+fileName;
//转换后的文档的全路径(所在文件夹+文件名)
String othersPath=destinationFilesPath+"\\"+fileNamesubstring(0,(fileNamelength()-5));
//
String inFile=docPath;
String outFile=othersPath;
//
boolean flag=false;
//核心代码
try{
//设置word可见性
appsetProperty("Visible", new Variant(false));
//
Dispatch docs=appgetProperty("Documents")toDispatch();
//打开word文档
Dispatch doc=Dispatchinvoke(docs, "Open", DispatchMethod, new Object[]{inFile,new Variant(false),new Variant(true)}, new int[1])toDispatch();
//0:Microsoft Word 97 - 2003 文档 (doc)
//1:Microsoft Word 97 - 2003 模板 (dot)
//2:文本文档 (txt)
//3:文本文档 (txt)
//4:文本文档 (txt)
//5:文本文档 (txt)
//6:RTF 格式 (rtf)
//7:文本文档 (txt)
//8:HTML 文档 (htm)(带文件夹)
//9:MHTML 文档 (mht)(单文件)
//10:MHTML 文档 (mht)(单文件)
//11:XML 文档 (xml)
//12:Microsoft Word 文档 (docx)
//13:Microsoft Word 启用宏的文档 (docm)
//14:Microsoft Word 模板 (dotx)
//15:Microsoft Word 启用宏的模板 (dotm)
//16:Microsoft Word 文档 (docx)
//17:PDF 文件 (pdf)
//18:XPS 文档 (xps)
//19:XML 文档 (xml)
//20:XML 文档 (xml)
//21:XML 文档 (xml)
//22:XML 文档 (xml)
//23:OpenDocument 文本 (odt)
//24:WTF 文件 (wtf)
//另存为指定格式的文档
Dispatchinvoke(doc, "SaveAs", DispatchMethod, new Object[]{outFile,new Variant(destinationFilesType)}, new int[1]);
//
Variant file=new Variant(false);
//关闭文档
Dispatchcall(doc, "Close",file);
//
flag=true;
}catch(Exception e){
eprintStackTrace();
Systemoutprintln("文档转换失败");
}finally{
appinvoke("Quit",new Variant[]{});
}
Systemoutprintln("转换完毕");
}
//word97-2003扩展名为doc
//判断是否为word2003-2007文档,及是否以doc为后缀名
else if(fileTypeequals("doc")){
Systemoutprintln("正在转换。。。");
//输出word文档所在路劲
Systemoutprintln("目录:"+sourceFilesPath);
//输出word文档名
Systemoutprintln("文件名:"+fileName);
//Systemoutprintln(fileNamesubstring(0, (fileNamelength()-4)));
//核心函数
//启动word
ActiveXComponent app=new ActiveXComponent("WordApplication");
//要转换的文档的全路径(所在文件夹+文件全名)
String docPath=sourceFilesPath+"\\"+fileName;
//转换后的文档的全路径(所在文件夹+文件名)
String othersPath=destinationFilesPath+"\\"+fileNamesubstring(0,(fileNamelength()-4));
//
String inFile=docPath;
String outFile=othersPath;
//
boolean flag=false;
//核心代码
try{
//设置word可见性
appsetProperty("Visible", new Variant(false));
//
Dispatch docs=appgetProperty("Documents")toDispatch();
//打开word文档
Dispatch doc=Dispatchinvoke(docs, "Open", DispatchMethod, new Object[]{inFile,new Variant(false),new Variant(true)}, new int[1])toDispatch();
//另存为指定格式的文档
Dispatchinvoke(doc, "SaveAs", DispatchMethod, new Object[]{outFile,new Variant(destinationFilesType)}, new int[1]);
//
Variant file=new Variant(false);
//关闭文档
Dispatchcall(doc, "Close",file);
//
flag=true;
}catch(Exception e){
eprintStackTrace();
Systemoutprintln("文档转换失败");
}finally{
appinvoke("Quit",new Variant[]{});
}
Systemoutprintln("转换完毕");
}
//文档的扩展名不是doc或docx
else{
Systemoutprintln("非word文档");
}
}
//如果是子文件夹,则递归遍历,将所有的word文档转换
else{
//
sourceChildPath=sourceFilesPath;
//该文件是目录
sourceChildPath=sourceChildPath+"\\"+sourceFilesList[i]getName()+"\\";
Systemoutprintln("源文件所在路径:"+sourceChildPath);
//修改目标文件夹,保持原来的层级关系
destiNationChildPath=destinationFilesPath;
destiNationChildPath=destinationFilesPath+"\\"+sourceFilesList[i]getName()+"\\";
Systemoutprintln("转换后文件所在路径"+destiNationChildPath);
//
mkdir(destiNationChildPath);
//递归遍历所有目录,查找word文档,并将其转换
change(sourceChildPath, destiNationChildPath,destinationFilesType);
}
}
Systemoutprintln("所有文档转换完毕");
}
/
用于创建文件夹的方法
@param mkdirName
/
public static void mkdir(String mkdirName){
try{
//使用指定的路径创建文件对象
File dirFile = new File(mkdirName);
//
boolean bFile = dirFileexists();
//已经存在文件夹, *** 作???提醒是否要替换
if( bFile == true ) {
Systemoutprintln("已经存在文件夹"+mkdirName);
}
//不存在该文件夹,则新建该目录
else{
Systemoutprintln("新建文件夹"+mkdirName);
bFile = dirFilemkdir();
if( bFile == true ){
Systemoutprintln("文件夹创建成功");
}else{
Systemoutprintln(" 文件夹创建失败,清确认磁盘没有写保护并且空件足够");
Systemexit(1);
}
}
}catch(Exception err){
Systemerrprintln("ELS - Chart : 文件夹创建发生异常");
errprintStackTrace();
}finally{
}
}
/
判断某个文件夹是否存在
@param path
/
public static boolean isPathExist(String path){
boolean isPathExist=false;
try{
File pathFile = new File(path);
if(pathFileexists())
isPathExist= true;
else
isPathExist= false;
}catch(Exception err){
errprintStackTrace();
}
return isPathExist;
}
/
主函数
/
public static void main(String[] args){
Scanner sc=new Scanner(Systemin);
//源文档所在路径
String sourceFilesPath="";
// String inputSourcePath="";
// boolean sourcePathFlag=true;
// Systemoutprintln("请输入要转换文档所在的文件夹");
// while(sourcePathFlag){
// inputSourcePath=scnext();
// if(!isPathExist(inputSourcePath))
// Systemoutprintln("源路径不存在,请输入正确的路径");
// else
// sourcePathFlag=false;
// }
// sourceFilesPath=inputSourcePath;
sourceFilesPath="D:\\word";
//目标文档要存放的目录
String destinationFilesPath="";
// String inputdestinationPath="";
// boolean destinationPathFlag=true;
// Systemoutprintln("请输入转换后文档要存放的文件夹");
// while(destinationPathFlag){
// inputdestinationPath=scnext();
// //目标文件不存在时,是否要提示用户创建文件
// if(!isPathExist(inputdestinationPath))
// Systemoutprintln("目标路径不存在,请输入正确的路径");
// else
// destinationPathFlag=false;
// }
// destinationFilesPath=inputdestinationPath;
destinationFilesPath="D:\\txt";
//选择要转换的类型
int destinationFilesType=0;
int inputNumber=0;
boolean numFlag=true;
Systemoutprintln("您要将word文档转换为哪种文档格式?");
Systemoutprintln("0:doc \t 2:txt \t 8:html \t 9:htm \t 11:xml \t 12:docx \t 17:pdf \t 18:xps");
while(numFlag){
inputNumber=scnextInt();
if(inputNumber!=2&&inputNumber!=8&&inputNumber!=9&&inputNumber!=11&&inputNumber!=12&&inputNumber!=17){
Systemoutprintln("您的输入有误,请输入要转换的文档类型前的数字");
}else
numFlag=false;
}
destinationFilesType=inputNumber;
//实行转换
change(sourceFilesPath, destinationFilesPath,destinationFilesType);
//测试各种类型转换
// for(int i=0;i<25;i++){
// destinationFilesType=i;
// Systemoutprintln("文件类型"+destinationFilesType);
// Systemoutprintln("存放目录:"+destinationFilesPath+"\\"+i);
// mkdir(destinationFilesPath+"\\"+i);
// change(sourceFilesPath, destinationFilesPath+"\\"+i,destinationFilesType);
// }
}
}
这个我刚用的。。格式都能带过来的。 你自己再下载个 jacob的包和dll文件
public static void list(File path, String[] extArr,HashMap hm) {
if (!pathexists()) {
Systemoutprintln("文件名称不存在!");
} else {
if (pathisFile()) {
for (int i = 0; i < extArrlength; i++) {
if (pathgetName()toLowerCase()endsWith(extArr[i])) {// 文件格式
hmput(pathgetName(), path);
}
}
} else {
File[] files = pathlistFiles();
for (int i = 0; i < fileslength; i++) {
list(files[i], extArr,hm);
}
}
}
}
以上就是关于java实现模板全部的内容,包括:java实现模板、java解析word文档有哪些方法、java如何将数据导入Excel模板等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)