ITPub博客

首页 > Linux操作系统 > Linux操作系统 > java读取word中的单元格[主要部分从网络获取的]

java读取word中的单元格[主要部分从网络获取的]

原创 Linux操作系统 作者:legumer 时间:2019-05-14 16:45:06 0 删除 编辑

package com.ssc.read;

/*
* Created on 2005-6-8
*
* 本对象没有区分WORD INSTANCE 和 DOCUMENT 由于我们只使用一个文档,所以没有区分
* Window - Preferences - Java - Code Style - Code Templates
*/

import com.jacob.com.*;
import com.jacob.activeX.*;
import com.ssc.Stock;

import jacobword.DHyperlink;
import jacobword.TestDataSource;

import java.util.*;
import java.net.*;
import java.io.*;/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
* 技术变更:
* 使用超链接的模式进行标注文字,比较容易理解
* Dim h As Hyperlink
Set h = Hyperlinks.add(Selection.Range, refTableAndField, SubAddress:="", ScreenTip:=showTxt, TextToDisplay:=txt)
h.Range.Select
With Selection.Font
.Underline = wdUnderlineNone
.Color = wdColorBlack
End With
*/

public class OperateWord
{

private ActiveXComponent word = null;
//new ActiveXComponent("Word.Application");
private Dispatch documents = null;
//Dispatch vActiveDocument =null;
private Dispatch vSelection = null;
private Dispatch wordfile = null;
//定义Vector变量
Vector vecStock = new Vector();

public OperateWord()
{
word = new ActiveXComponent("Word.Application");
documents = word.getProperty("Documents").toDispatch();
}

public void appendItem(String name, String strRefItem, String strShowTxt)
{
Dispatch Hyperlinks = Dispatch.get(wordfile, "Hyperlinks").toDispatch();
Dispatch range = Dispatch.get(vSelection, "Range").toDispatch();
Dispatch h =
Dispatch
.invoke(
Hyperlinks,
"Add",
Dispatch.Method,
new Object[] {
range,
new Variant("A"),
new Variant("A"),
new Variant(strRefItem),
new Variant(strShowTxt)
},
new int[4])
.toDispatch();
Dispatch hRange = Dispatch.get(h, "Range").toDispatch();
Dispatch.call(hRange, "select");
Dispatch font = Dispatch.get(vSelection, "Font").toDispatch();
Dispatch.put(font, "Underline", new Variant(0));
Dispatch.put(font, "Color", new Variant(0));
Dispatch.call(vSelection, "MoveRight", new Variant(1), new Variant(1));
}

public void close()
{
word.invoke("Quit", new Variant[] {new Variant(false)});
}

public int getTableRows(Dispatch table)
{
Dispatch rows=Dispatch.get(table,"rows").toDispatch();
return Dispatch.get(rows,"count").toInt();
}

public void openWordFile(String strFileName)
{
wordfile =
Dispatch
.invoke(
documents,
"Open",
Dispatch.Method,
new Object[] { strFileName, new Variant(true), new Variant(false)},
new int[1])
.toDispatch();
vSelection = word.getProperty("Selection").toDispatch();
dontShowHyperlink();
//setVisible(true);
}

public void printOut()
{
Dispatch.call(wordfile, "PrintOut");
}

public void printPreView()
{
Dispatch.call(wordfile,"PrintPreView");
}

public void replaceHyperlink(String Hyperlink, String information)
{
Dispatch.call(wordfile, "replaceHyperlink", Hyperlink, information);
// replaceTarget
}

public void replaceImage(String name, String fileName)
{
/** 目前没有实现*/
if(true)
return;
// select(name);
if (!name.equals(Dispatch.get(vSelection, "text").toString()))
/** 没有找到需要的内容*/
return;
Dispatch InlineShapes = Dispatch.get(vSelection, "InlineShapes").toDispatch();
Dispatch.invoke(
InlineShapes,
"AddPicture",
Dispatch.Method,
new Object[] { fileName },
new int[1]);
//Selection.InlineShapes.AddPicture fileName:=fileName, LinkToFile:=False, SaveWithDocument:=True
}

public void setVisible(boolean visible)
{
word.setProperty("Visible", new Variant(visible));
}

public void sleep(int ms)
{
try
{
Thread.sleep(ms);
}
catch(Exception e)
{
e.printStackTrace();
}
}


public void unSelect()
{
Dispatch.invoke(vSelection, "MoveRight", Dispatch.Method, new Object[] {}, new int[1]);
}

//Dispatch vTables=null;
private TestDataSource ids = null;

/**
* 此处插入方法描述。
* 创建日期:(2005-6-12 15:07:39)
*/
public void active()
{
Dispatch.call(wordfile, "applicationActive");
}

/**
* 此处插入方法描述。
* 创建日期:(2005-6-14 9:08:33)
*/
private void copyOrDeleteRow(Dispatch dRow, int nDataBlockRow)
{
/** 没有找到变量*/
if (nDataBlockRow == -1)
return;
/** 变量内容为零条*/
if (nDataBlockRow == 0)
{
Dispatch.call(dRow, "delete");
return;
}
/** 不用复制*/
if (nDataBlockRow == 1)
return;
if (nDataBlockRow > 1)
{
Dispatch.call(dRow, "select");
//Dispatch.call(vSelection, "SelectRow");
Dispatch.call(vSelection, "Copy");
int nCopyNow = nDataBlockRow - 1;
for (int nCopys = 0; nCopys < nCopyNow; nCopys++)
{
try
{
Dispatch.call(vSelection, "Paste");
}
catch(Exception e)
{
e.printStackTrace();
//有时候文档损坏,可以忽略本问题,实际上已经粘贴上了
}
}
}
}

private void dontShowHyperlink()
{
Dispatch activeWindow = Dispatch.get(word, "ActiveWindow").toDispatch();
Dispatch view = Dispatch.get(activeWindow, "View").toDispatch();
Dispatch.put(view, "ShowFieldCodes", new Variant(false));
}

public HashMap getTableInforamtion() {
/** 取得有多少表*/
Dispatch dTables[] = getTables();
//定义存储数据的数据结构
HashMap hmStock = new HashMap();
//证券代码
String strCode = null;
//证券价格
String strPrice = null;
Double dbPrice = new Double(0);
/** 考虑嵌套关系反向操作表格序列,
处理一个表嵌套另外一个表的情况*/
for (int nTable = dTables.length - 1; nTable >= 0; nTable--)
{
Dispatch dTable = dTables[nTable];
/** 从下往上稍描*/
Dispatch dRows = Dispatch.get(dTable, "rows").toDispatch();
int nRows = Dispatch.get(dRows, "count").toInt();
for (int nRow = nRows - 1; nRow >= 0; nRow--) {
/** 得到第nRow的内容*/
/** 查找出 ,动态字段 */
Dispatch dRow = getRow(dRows, nRow);
if (dRow == null)
continue;
Dispatch.call(dRow,"select");
Dispatch range = Dispatch.get(vSelection, "Range").toDispatch();
//字段数
Dispatch cells = Dispatch.call(dRow, "cells").toDispatch();
int nCells = Dispatch.get(cells, "count").toInt();
String sCells = Dispatch.get(range,null).toString();
//根据进行分割
String[] oCells = sCells.split("");
//System.out.println(oCells.length - 1);
if(nCells > 2)
{
//证券代码
strCode = oCells[1].replaceAll(" ", "");
strCode = oCells[1].replaceAll("", "");
//判断是否为证券代码,判断条件(数字和长度)
if(strCode.matches("^d{6}$"))
{
//价格
strPrice = oCells[10];
strPrice = oCells[10].replaceAll(" ", "");
strPrice = oCells[10].replaceAll("", "");
//dbPrice = Double.parseDouble(strPrice);
dbPrice = new Double(Double.parseDouble(strPrice));
//设置对象信息
//证券对象
SZStock szstock = new SZStock();
szstock.setStrCode(strCode);
szstock.setDbPrice(dbPrice);
vecStock.add(szstock);
//存储数据
hmStock.put((String)strCode, (Double)dbPrice);
//System.out.println(strCode + "-" + strPrice);
}
}
}
}
//打印HashMap里的数据
// System.out.println(hmStock.values());
//返回值
return hmStock;
}

//返回证券信息向量的数据
public Vector getStockInfo()
{
return vecStock;
}

private int getHyperLinkeCount(Dispatch d /** table or row */)
{
Dispatch.call(d, "select");
Dispatch Hyperlinks = Dispatch.get(vSelection, "Hyperlinks").toDispatch();
int nHyperlink = Dispatch.get(Hyperlinks, "count").toInt();
return nHyperlink;
}


private Dispatch getRow(Dispatch rows, int row)
{
try
{
Dispatch dRow =
Dispatch
.invoke(
rows,
"item",
Dispatch.Method,
new Object[] { new Integer(row + 1)},
new int[1])
.toDispatch();
return dRow;
}
catch(ComFailException cfe)
{
/** 带有合并行的情况*/
return null;
}
}
private Dispatch getCell(Dispatch dTable, int nRow, int nCell)
{
try
{
Dispatch dCell = Dispatch.call(dTable, "Cell", new Integer(nRow), new Integer(nCell)).toDispatch();
Dispatch.call(dCell,"Select");
Dispatch dRange = Dispatch.get(vSelection, "Range").toDispatch();
return dRange;
}
catch(ComFailException cfe)
{
/** 带有合并行的情况*/
return null;
}
}

public int getTableCount()
{
Dispatch tableAcount = Dispatch.get(wordfile, "tables").toDispatch();
return Dispatch.get(tableAcount, "count").toInt();
}

private Dispatch[] getTables()
{
/** 由于*/
Vector v=new Vector();
getTables01(wordfile,v);
return (Dispatch[])v.toArray(new Dispatch[0]);
}


private void getTables01(Dispatch objcet,Vector vTableStore)
{
/** 由于*/
Dispatch tables = Dispatch.get(objcet, "tables").toDispatch();
int nTableAmount = Dispatch.get(tables, "count").toInt();
for (int i = 0; i < nTableAmount; i++) {
Dispatch table =
Dispatch
.invoke(
tables,
"item",
Dispatch.Method,
new Object[] { new Integer(i + 1)},
new int[1])
.toDispatch();
vTableStore.add(table);
getTables01(table,vTableStore);
}
// return Dispatch.call(Dispatch, "item",).toInt();
}

private DHyperlink[] listHyperlinks()
{
return listHyperlinks(wordfile);
}

private DHyperlink[] listHyperlinks(Dispatch dObject /* table or row */)
{
//if (dObject != wordfile)
try {
Dispatch.call(dObject, "select");
Dispatch Hyperlinks = Dispatch.get(vSelection, "Hyperlinks").toDispatch();
int nHyperlink = Dispatch.get(Hyperlinks, "count").toInt();
//DHyperlink dHyperlinks[] = new DHyperlink[nHyperlink];
Vector v = new Vector();
for (int i = 0; i < nHyperlink; i++) {
//System.out.println(i+"HLINK");
// 碰见过问党错误
try {
v.add(
new DHyperlink(
Dispatch
.invoke(
Hyperlinks,
"item",
Dispatch.Method,
new Object[] { new Integer(i + 1)},
new int[1])
.toDispatch()));
}
catch (Throwable t)
{
System.out.println(t.getMessage());
}
}
return (DHyperlink[]) v.toArray(new DHyperlink[0]);
}
catch (Exception e)
{
System.out.println("对象已经被删除,没有 需要填充的数据");
/** 有可能这个表格都被删除*/
return new DHyperlink[0];
}
}

public void newWordFile()
{
wordfile =
Dispatch
.invoke(
documents,
"Add",
Dispatch.Method,
new Object[] {"Normal", new Variant(false), new Variant(0)
},
new int[1])
.toDispatch();
vSelection = word.getProperty("Selection").toDispatch();
dontShowHyperlink();
}

private void replaceHyperlink(DHyperlink hyperlink, String information)
{
//Dispatch.call(wordfile, "replaceHyperlink", Hyperlink, information);
//Dispatch.call(hyperlink.dObject,"Range","select");
if (information == null)
information = " ";
else
{
information = information.trim();
if (information.length() == 0)
information = " ";
}
Dispatch.put(hyperlink.dObject, "TextToDisplay", information);
}

public void replaceHyperlinkBy(TestDataSource idsSet)
{
ids = idsSet;
getTableInforamtion();
replaceObjectHyperlinks(wordfile);
}

/**
* 此处插入方法描述。
* 创建日期:(2005-6-17 9:50:42)
* @param d com.jacob.com.Dispatch
*/
private void replaceObjectHyperlinks(Dispatch d)
{
int nExceptionCounter=0;
do {
try {
int nHyperlinks = getHyperLinkeCount(wordfile);
DHyperlink Hyperlinks[] = listHyperlinks();
for (int i = 0; i < Hyperlinks.length; i++)
{
String strData = Hyperlinks[i].strRefTxt;
/**需要的数据向*/
String infor[] = ids.getData(strData);
if (infor.length > 0)
replaceHyperlink(Hyperlinks[i], infor[0]);
else
replaceHyperlink(Hyperlinks[i], "");
}
for (int i = 0; i < Hyperlinks.length; i++)
{
Hyperlinks[i].delete();
}
nExceptionCounter = 0;
if (nHyperlinks == Hyperlinks.length)
break;
if (nHyperlinks == 0)
break;
}
catch (Exception e)
{
e.printStackTrace();
nExceptionCounter++;
System.out.println("Redo on flie:" + nExceptionCounter);
sleep(200);
if (nExceptionCounter == 5)
/** 太多的错误*/
if (nExceptionCounter >= 5)
throw new ComFailException("替换内容失败");
}
}
while (true);
}

/**
* 此处插入方法描述。
* 创建日期:(2005-6-13 14:06:01)
*/
public void save()
{
Dispatch.call(wordfile, "save");
}

/**
* 此处插入方法描述。
* 创建日期:(2005-6-12 15:07:39)
*/
public void setSize(int width, int height)
{
try
{
Dispatch activeWindow = Dispatch.get(word, "Application").toDispatch();
Dispatch.put(activeWindow, "WindowState", new Variant(0));
Dispatch.put(activeWindow, "Top", new Variant(0));
Dispatch.put(activeWindow, "Left", new Variant(0));
Dispatch.put(activeWindow, "Height", new Variant(height));
Dispatch.put(activeWindow, "width", new Variant(width));
}
catch (Exception e)
{
e.printStackTrace();
}
}

}


使用jacob的第三方插件。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/48770/viewspace-179624/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 内容管理系统
请登录后发表评论 登录
全部评论

注册时间:2003-06-12

  • 博文量
    20
  • 访问量
    17218