威尼斯www.9778.com-威尼斯正版官方网站

C++ 向Excel中写字符串

日期:2019-12-25编辑作者:编程人生

我用的类是这几个:CApplicationapp;CWorkbookbook;//工作薄CWorkbooksbooks;//工作薄集合CWorksheetsheet;//工作表CWorksheetssheets;//工作表集合CRangerange;//单元格区域写二维数组这样写:COleSafeArrayolesaWrite;olesaWrite.Create(vt,sizeof(sabWrite)/sizeof(SAFEARRAYBOUND),sabWrite);.........range.put_Value2(olesaWrite);但是写字符串怎么写?

浅谈Java中利用JCOM实现仿Excel编程

 

  在JAVA中使用JCOM和JXL注意要点: 

  (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。 

  (2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下) 

  把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛出一个JComException的异常) 

  (1)首先应该判断一个传进来的路径是Word 或是 Excel 还是其他的东东。 

if(path.endsWith(".doc")){ 
...... 
}

  注:如果是excel后缀是".xls"; 

  (2)然后你要有两个对象: 

ReleaseManager rm = new ReleaseManager(); 
IDispatch xlsApp=null;

  注:ReleaseManager相当于一个容器,与你机器上的所有JCOM组建交互,根据你传的参数他会去寻找你机器上的所有JCOM能操作的组建; 

  IDispatch 可以理解为一个对象,所有的东东都是对象; 

  (3)你要让他知道你要和EXCEL交互你得这样做 

xlsApp = new IDispatch(rm, "Excel.Application");

  (4)接着要得到一个Workbooks(工作薄) 

IDispatch excel = (IDispatch) xlsApp.get("Workbooks");

  (5)设置当前对象是否可见 

xlsApp.put("Visible", new java.lang.Boolean(false));

  (6)得到工作薄以后要打开 

IDispatch workbook = (IDispatch) excel.method("open", new Object[] { FilePath(EXCEL存放的路径) });

  (7)判断文件是否存在如果存在则删除 

File f = new File(outPath); 
if (f.exists()) 
f.delete();

  (8)将工作薄另存为 

workbook.method("saveAs", new Object[] { outPath, new Integer(9) });

  (9)获得一个工作薄(workbook)下的所有工作表(Sheets) 

IDispatch sheets = (IDispatch) workbook.get("Sheets");

  注:得到的是一个数组; 

  (10)获得工作表(Sheets)的总数 

int sheetsCount = Integer.parseInt(sheets.get("Count").toString());

  (11)得到每个工作表(Sheets)的名称 

for(int sheetInx=1;sheetInx <= sheetsCount;sheetInx++) { 
IDispatch sheet = (IDispatch) sheets.get("item", new Object[] { new Integer(sheetInx) }); 
String sheetName = sheet.get("name").toString(); 
}

  注意:excel都是从1开始遍历 而不是从0开始 所以for里面有多种写法看自己怎么顺手怎么写; 

  遍历工作表除了传索引还能传工作表名称:IDispatch sheet = ((IDispatch) sheets.get("item", new Object[] { sheetName })); 

  (12)获得正在活动的工作表(sheet) 

IDispatch asheet = (IDispatch) xlsApp.get("ActiveSheet");

  注:xlsApp是从ReleaseManager里面获得EXCEL对象的一个IDispatch对象 

  如果是获得sheets要先获得工作薄(Workbook)然后用工作薄(Workbook)获得他下的所有工作表(sheets) 

  (13)获得工作表里面的所有行总数(6万多行吧) 

IDispatch row = (IDispatch)cursheet.get("Rows"); 
int rows = Integer.parseInt(row.get("Count").toString());

  (14)获得工作表里面的所有列总数(256列) 

IDispatch col = (IDispatch)sheet.get("Columns"); 
int cols = Integer.parseInt(col.get("Count").toString());

  (15)获得工作表里面可视的所有行总数 

IDispatch row = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Rows"); 
int rows = Integer.parseInt(row.get("Count").toString());

  (16)获得工作表里面可视的所有列总数 

IDispatch col = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Columns"); 
int cols = Integer.parseInt(col.get("Count").toString());

  (17)获得行列以后要获得里面的内容(这里用的rows 和 cols就是上面所得的) 

String cellVal=""; 
String cellTxt=""; 
String hasFormula= ""; 
String cellFormula=""; 
for(int i=0;i<rows;i++){ 
for(int j=0;j<cols;j++){ 
IDispatch cells = (IDispatch) cursheet.get("Cells", new Object[] { new Integer(i+1),new Integer(j+1) }); 
cellVal = cells.get("value").toString(); 
cellTxt = cells.get("text").toString(); 
hasFormula = cells.get("HasFormula").toString(); 
cellFormula = cells.get("FormulaR1C1").toString(); 

}

  注:这个遍历的时候也是从1开始; 

  cells.get("value")获得的是浮点数格式 如果你输入的是1,得到的会是1.0; 

  cells.get("text")获得的是本身,你输入什么获得的就是什么; 

  cells.get("HasFormula")判断是否是公式,如果单元格里是公式则返回真(true),如果不是公式则返回假(false); 

  cells.get("FormulaR1C1")获得公式,获得单元格里公式的内容; 

  (18)保护工作表 

asheet.method("Protect", new Object[] { 
 password, new java.lang.Boolean(true), new java.lang.Boolean(true) 
});

  注:Protect后有N多参数 第1--3个分别是 password,DrawingObjects,Contects。 

  (19)解工作表保护 

asheet.method("Unprotect", new Object[] { password });

  (20)在finally里面写关闭 

if (xlsApp != null) { 
((IDispatch) xlsApp.get("ActiveWorkbook")).put("Saved", new java.lang.Boolean(true)); //保存工作薄 
xlsApp.method("quit", null); //quit 是关闭的是整个EXCEL 
xlsApp = null; 

rm.release(); 
rm = null;

  (21)关闭根据情况也写在finally 里面 

workbook.method("close", null); 
xlsApp.method("quit", null); 
xlsApp=null; 
rm.release(); 
rm = null;

  注:workbook.method("close", null);关闭的是Workbook里的工作表; 

  xlsApp.method("quit", null);关闭的是整个工作薄 

  注意: 

  关闭的时候一定要加上 

//rm 就是ReleaseManager的实例 
rm.release(); 
rm = null; 
如果你打开EXCEL不加上面两句的话在进程里面还运行着EXCEL.EXE 
//----------------------------------------------------------------

  如有不对请多多指教!!谢谢
     
  查阅关于Java的全部文档

图片 1

Worksheet 对象

代表一个工作表。

Worksheet对象是**Worksheets* 集合的成员。 Worksheets 集合包含工作簿中的所有 Worksheet 对象。

Worksheet对象对象也是*Sheets* 集合的一个成员。 Sheets 集合包含工作簿中所有的工作表(图表工作表和工作表)。事件

Activate 事件:激活工作簿、工作表、图表工作表或嵌入式图表时发生此事件。

BeforeDelete 事件:在工作表被删除之前, 发生此事件。

BeforeDoubleClick 事件:当双击工作表时发生此事件,此事件先于默认的双击操作。

BeforeRightClick 事件:右键单击工作表时发生此事件,此事件先于默认的右键单击操作。

Calculate事件:对于 Worksheet 对象,在对工作表进行重新计算之后发生此事件。

Change 事件:当用户更改工作表中的单元格,或外部链接引起单元格的更改时发生此事件。

Deactivate事件:图表、工作表或工作簿被停用时发生此事件。

FollowHyperlink 事件:当单击工作表上的任意超链接时,发生此事件。 对于应用程序级和工作簿级事件, 请参阅**SheetFollowHyperlink** 事件和**SheetFollowHyperlink** 事件。

LensGalleryRenderComplete 事件:在标注库的图标 完成呈现时发生。

PivotTableAfterValueChange 事件:在编辑或重新计算(对于包含公式的单元格)数据透视表中的单元格或单元格区域后发生

PivotTableBeforeAllocateChanges 事件:在将更改应用到数据透视表前发生。

PivotTableBeforeCommitChanges 事件:在向数据透视表的 OLAP 数据源提交更改之前发生。

PivotTableBeforeDiscardChanges 事件:在放弃对数据透视表所做的更改之前发生。

PivotTableChangeSync 事件:在更改了数据透视表之后发生。

PivotTableUpdate 事件:工作簿中的数据透视表更新后发生此事件。

SelectionChange 事件:当工作表上的选定区域发生改变时发生此事件。

TableUpdate 事件:在工作表上更新了连接到数据模型的查询表之后, 发生此事件。方法

Activate 方法:使当前工作表成为活动工作表。

Calculate 方法:计算所有打开的工作簿、工作簿中的某张特定工作表或工作表指定区域中的单元格

ChartObjects 方法:返回一个 object 类型的值, 该值代表工作表上单个嵌入图表 ( ChartObject 对象) 或所有嵌入式图表 ( ChartObjects 对象) 的集合。

CheckSpelling 方法:检查对象的拼写。

CircleInvalid 方法:对工作表中的无效数据项进行圈释。

ClearArrows 方法:清除指定工作表的追踪箭头。 使用审核功能可添加追踪箭头。

ClearCircles 方法:清除指定工作表的无效数据项的圈释。

Copy 方法:将工作表复制到当前工作簿或新工作簿中的其他位置。

Delete 方法:删除对象。

Evaluate方法:将 Microsoft Excel 名称转换为一个对象或值。

ExportAsFixedFormat 方法:导出为指定格式的文件。

Move 方法:将工作表移到工作簿中的其他位置。

OLEObjects 方法:返回一个 object 类型的值, 该值代表图表或工作表上的单个 ole 对象 ( OLEObject) 或所有 OLE 对象的集合 ( OLEObjects 集合)。 此为只读属性。

Paste 方法:将“剪贴板”中的内容粘贴到工作表上。

PasteSpecial 方法:以指定格式将剪贴板中的内容粘贴到工作表上。可用本方法从其他应用程序中粘贴数据,或以特定格式粘贴数据。

PivotTables方法:返回一个 object 类型的值, 该值代表工作表上的单个数据透视表 或所有**** 数据透视表报表 (一个数据透视表对象) 的集合。 此为只读属性。

PivotTableWizard 方法:创建一个新的数据透视表。 此方法不显示数据透视表向导。 此方法不能用于 OLE DB 数据源。 使用**add** 方法添加数据透视表缓存, 然后基于该缓存创建数据透视表报表。

PrintOut 方法:打印对象。

PrintPreview 方法:按对象打印后的外观效果显示对象的预览。

Protect 方法:保护工作表使其不被修改。

ResetAllPageBreaks 方法:重新设置指定工作表上的所有分页符。

SaveAs 方法:将对图表或工作表的更改保存到另一不同文件中。

Scenarios方法:返回一个 object 类型的值, 该值代表工作表上的单个方案 或方案集合 (一个**场景** 对象)。

Select 方法:选择对象。若要选择工作表或多个工作表, 请使用select方法。 若要使单个工作表成为活动工作表, 请使用**Activate** 方法。

SetBackgroundPicture 方法:为工作表设置背景图形。

ShowAllData 方法:使当前筛选列表的所有行均可见。 如果正在使用自动筛选,则本方法将下拉列表框内容改为“”。

ShowDataForm 方法:显示与指定工作表相关联的数据表单。

Unprotect 方法:去除工作表或工作簿中的保护。 如果工作表或工作簿不是受保护的,则此方法不起作用。

XmlDataQuery 方法:返回一个**Range** 对象, 该对象代表映射到特定 XPath 的单元格。 如果指定的 XPath 路径尚未映射到工作表,或者映射的区域为空,则返回 Nothing。

XmlMapQuery 方法:返回一个**Range** 对象, 该对象代表映射到特定 XPath 的单元格。 如果指定的 XPath 路径尚未映射到工作表,则返回 Nothing。属性

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

AutoFilter属性:如果筛选功能为打开, 则返回自动筛选对象。 此为只读属性。

AutoFilterMode 属性:如果当前在工作表上显示有“自动筛选”下拉箭头,则该值为 True。 本属性与 FilterMode 属性互相独立。 读/写 Boolean。

Cells 属性:返回一个 Range 对象,它表示工作表上的所有单元格(而不是当前在使用的单元格)。

CircularReference 属性:返回一个**range** 对象, 该对象表示包含工作表上第一个循环引用的区域; 或者, 如果工作表上没有循环引用, 则返回Nothing 。 在继续执行计算之前,必须删除循环引用。

CodeName 属性:返回对象的代码名。 只读的字符串。

Columns 属性:返回一个 Range 对象,它表示所指定的工作表上的所有列。

Comments属性:返回一个**注释** 集合, 该集合代表指定工作表的所有注释。 此为只读属性。

ConsolidationFunction 属性:返回当前合并计算所使用的函数代码。 可以是**XlConsolidationFunction** 的常量之一。 Long 类型,只读。

DisplayPageBreaks 属性:如果显示指定工作表中的分页符(包括自动和手动分页符),则该属性值为 True。 读/写 Boolean。

Hyperlins属性:返回一个代表工作表的超链接的**超链接** 集合。

Index属性:返回一个Long值, 它代表对象在对象的集合中的索引号。

Name 属性:返回或设置一个String值, 它代表对象名称。

Names属性:返回一个**Names** 集合, 该集合代表所有工作表特定的名称 (使用 "WorksheetName!" 定义的名称。 前缀)。 Names 对象,只读。

Next 属性:返回一个代表下一个工作表的**工作** 表对象。

Outline属性:返回一个代表指定工作表的大纲的**大纲** 对象。 此为只读属性。

PageSetup 属性:返回一个**PageSetup** 对象, 该对象包含指定对象的所有页面设置。 此为只读属性。

Parent 属性:返回指定对象的父对象。 只读。

Previous 属性:返回一个代表上一个工作表的**工作** 表对象。

ProtectContents 属性:如果工作表内容是受保护的,则为 True。 此属性保护单独的单元格。 若要打开内容保护, 请使用_content_参数设置为True的**保护** 方法。 只读 Boolean 类型。

Protection 属性:返回一个**protection** 对象, 该对象表示工作表的保护选项。

Range 属性:返回一个 Range 对象,它表示一个单元格或单元格区域。

Rows 属性:返回一个 Range 对象,它表示所指定的工作表上的所有行。

ScrollArea 属性:以 A1 样式的区域引用形式返回或设置允许滚动的区域。 用户不能选定滚动区域之外的单元格。 读/写 String。

Sort属性:返回一个**Sort** 对象。 此为只读属性。

StandardHeight 属性:返回工作表中所有行的标准行高,以磅为单位。 只读双精度型。

StandardWidth 属性:返回或设置工作表中所有列的标准列宽。 读/写Double。

Tab 属性:为工作表返回一个**Tab** 对象。

UsedRange 属性:返回一个 Range 对象,它表示指定工作表上所使用的区域。 此为只读属性。

Visible 属性:返回或设置一个**XlSheetVisibility** 值, 该值确定对象是否可见。

VPageBreaks 属性:返回一个**VPageBreaks** 集合, 该集合代表工作表上的垂直分页符。 此为只读属性。

相关代码说明和实例可查询VBA开发文档

以上内容是本人自学笔记总结,欢迎指正,有关Excel的问题,可私信联系,互相交流讨论,共同进步,谢谢。

本文由威尼斯www.9778.com发布于编程人生,转载请注明出处:C++ 向Excel中写字符串

关键词:

怎么使用com的回调

有2个类,CCDMAX和CCDMAXEvents。 classCCDMAX:publicCOleDispatchDriver{public:CCDMAX(){}//调用COleDispatchDriver默认构造函数CCDMAX(LPDISPAT...

详细>>

MFC操作word获取当前页的页码

COleVariantcovZero((short)0),covTrue((short)TRUE);wd.m_wdView.SetSeekView(10);//wdSeekCurrentPageFooter=10wd.m_wdParagraphFormat=wd.m_wdSel.GetParagrap...

详细>>

各位大佬,请帮忙看一下我这个程序,平台评测说是runtime erro

编了一个命令行输入式的矩阵计算器,是一个控制台程序,老师让改成可视化窗口式的程序,不太会,怎么在MFC中实...

详细>>

vc2005编译ffmpeg以及ffplay

typedefstructAVOption{constchar*name;constchar*help;intoffset;enumAVOptionTypetype;union{int64_ti64;doubledbl;constchar*str;/*TODOthoseareunusednow*/AV...

详细>>