http://blog.csdn.net/shuilan0066/article/details/7925023

示例---将所有单元格设置为文本格式:

[cpp] view plain copy print ?
  1. _Application app;       //Excel应用程序接口
  2. Workbooks books;        //工作薄集合
  3. _Workbook book;     //工作薄
  4. Worksheets sheets;      //工作表集合
  5. _Worksheet sheet;       //工作表
  6. Range range;            //Excel中针对单元格的操作都应先获取其对应的Range对象
  7. Font font;
  8. Range cols;
  9. /*
  10. COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用
  11. VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant
  12. 类来转换了的。
  13. */
  14. //covOptional 可选参数的VARIANT类型
  15. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  16. if( !app.CreateDispatch(L"Excel.Application") ){
  17. this->MessageBox(L"无法创建Excel应用!");
  18. return;
  19. }
  20. //获取工作薄集合
  21. books=app.GetWorkbooks();
  22. //添加一个工作薄
  23. book=books.Add(covOptional);
  24. //获取工作表集合
  25. sheets=book.GetSheets();
  26. //获取第一个工作表
  27. sheet=sheets.GetItem(COleVariant((short)1));
  28. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
  29. range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型
  30. //合并单元格
  31. //加载要合并的单元格
  32. range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);
  33. range.Merge(COleVariant((long)0));
  34. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
  35. range.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计")));  //A1
  36. range.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名")));              //A2
  37. range.SetItem(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("课时")));                //B2

函数 SetNumberFormat() 用于设置单元格的格式,但是首先我们必须知道所有格式的标记。

文本类:
1、@ 指定内容按文本显示,主要用于编码、手机号等用数字表示的文本。设定该格式后,可以保证导出excel时,此类文本不会被转成数字显示。

数值类:
1、 0.00 表示两位小数,例如3.10367显示为3.10
2、 0.## 表示两位小数,当小数末位为0时,0将不显示。例如3.10显示为3.1
3、 "#,##0.00 "表示两位小数,且显示千份位
4、 #,##0.00;[Red]#,##0.00 表示负数红字
5、0.00;[Red]0.00;" " 表示负数红字,且数据为0时不显示
6、0.00;[Red](0.00);" "表示正数时两位小数,负数时两位小数并显示红色,0时不显示。0.00;[Red](0.00)只是一个示例,可以为任意的数字格式串,后边再加上;" "(空格)即表示数据为0时不显示。

日期类:
1、 yyyy-m-d
2、 yyyy-MM-dd
3、 yyyy-MM-dd hh:mm:ss
4、 yyyy年MM月dd日

百分比:
1、0%
2、0.00%

详细请打开Excel2003,单元格右键,设置单元格格式,选一种格式,点自定义即可看到该格式的格式串;有的Excel格式串后有带”_”,在使用时,必须去掉。

设置篇

1 设置单元格的值

 

1)

选中指定单元格,使用SetValue设置值

CellName.Format(_T("A%d"),i);//单元格的名称

range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格range.SetValue(COleVariant(subFileName));

CellName.Format(_T("C%d"),i);//单元格的名称

range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格

range.SetValue(COleVariant((long)i));

2)

选中所有的单元格, 使用SetItem 设置指定单元格的值

range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

//设置第I行 第1、2、3列的值

range.SetItem(COleVariant((long)(i)),COleVariant((long)1),COleVariant(subFileName)); //第一列

range.SetItem(COleVariant((long)(i)),COleVariant((long)2),COleVariant(unicodeStr));  //第二列

range.SetItem(COleVariant((long)(i)),COleVariant((long)3),COleVariant((long)i));      //第三列

 

2 设置行高列宽

选中某列 设置列宽

//获得所有列

range.AttachDispatch(sheet.GetColumns(),true);

//设置第一列的列宽  Range cols

cols.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

//设置第4列的列宽

cols.AttachDispatch(range.GetItem(COleVariant((long)4),vtMissing).pdispVal,TRUE);

cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

//设置列宽为自动适应

cols.AutoFit();

设置行高

Range rows;

range.AttachDispatch(sheet.GetRows(),TRUE);

//选择第一行

rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

//设置行高

rows.SetRowHeight(COleVariant((long)60));

注意: 行高列宽使用的单位不一样

3 设置单元格类型

range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型

4 设置单元格字体

Font ft;

//设置第一列的字体

range.AttachDispatch(sheet.GetColumns(),true);

range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

//字体作用范围

ft.AttachDispatch(range.GetFont());

ft.SetName(COleVariant(_T("宋体")));

ft.SetSize(COleVariant((long)48));

ft.SetBold(COleVariant((long)1));//粗体

ft.SetColorIndex(COleVariant((long)2));//设置字体颜色

5 设置单元格背景色

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))));

//设置底色/

Interior it;

it.AttachDispatch(range.GetInterior());

it.SetColorIndex(COleVariant((long)11));//标题底色

表格内容的底色

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

it.AttachDispatch(range.GetInterior());

it.SetColorIndex(COleVariant((long)15));

6 设置表格边框

1)

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

//LineStyle=线型Weight=线宽ColorIndex=线的颜色(-4105为自动)

range.BorderAround(COleVariant((long)1),(long)2,((long)-4105),vtMissing);//设置边框

2)

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

_variant_t v1;  //线型

_variant_t v2;  //宽度

_variant_t v3;  //颜色

v1.vt=VT_I2;

v1.lVal=2; // 线的样式:- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot;

v2.vt=v1.vt;

v2.lVal=3; // 线的粗细程度

v3.vt=v1.vt;

v3.lVal=1; // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue;

UnitRge.BorderAround(v1,v2,v3,vtMissing);//设置边框

7 合并单元格

 

1)

//合并单元格

//加载要合并的单元格

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

range.Merge(COleVariant((long)0));

2)

//将第一个单元格合并成行,列

range.AttachDispatch(sheet.GetCells());

unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); //第一个单元格

unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)3),COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格

unionRange.Merge(COleVariant((long)0));   //合并单元格

8 设置单元格文本为自动换行 及排列方式

 

range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

range.SetWrapText(COleVariant((long)1));//设置单元格内的文本为自动换行

//设置齐方式为水平垂直居中

//水平对齐:默认=1,居中=-4108,左=-4131,右=-4152

//垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107

range.SetHorizontalAlignment(COleVariant((long)-4108));

range.SetVerticalAlignment(COleVariant((long)-4108));

9 在单元格中插入公式

//选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形式

range=sheet.GetRange(COleVariant(L"A2"),COleVariant(L"A2"));

range.SetFormula(COleVariant(L"=RAND()*100000"));

range.SetNumberFormat(COleVariant(L"$0.00"));

10 在单元格中插入图片

Shapes   shapes   =   sheet.GetShapes();// 从Sheet对象上获得一个Shapes

range.AttachDispatch(sheet.GetRange(COleVariant(L"E5"),COleVariant(L"E5"))); // 获得Range对象,用来插入图片

shapes.AddPicture( L"d:\\pic.bmp "   ,   false   ,   true   ,   (float)range.GetLeft().dblVal

,(float)range.GetTop().dblVal,(float)range.GetWidth().dblVal,(float)range.GetHeight().dblVal);

ShapeRange   sRange   =   shapes.GetRange(_variant_t(long(1)));

sRange.SetHeight(float(30));  //在RANGE范围内 设置图片宽高
   sRange.SetWidth(float(30));

11 对选取的区域进行排序

#define xlAscending (long) 1

#define xlDescending (long) 2

#define vOpt COleVariant((long) DISP_E_PARAMNOTFOUND, VT_ERROR)

#define xlHeader (long) 1                            // 选取的区域有标题

#define xlNoHeader (long) 2                          // 选取的区域无标题    一定要正确确定是否有标题,否则排序可能不成功

#define xlMatchCase COleVariant((long) 1)

#define xlIgnoreCase COleVariant((long) 0)

#define xlTopToBottom (long) 1                       // 垂直方向进行排序

#define xlLeftToRight (long) 2                       // 水平方向进行排序

#define xlPinYin (long) 1 // this is the default     // 按字符的中文拼音进行排序

#define xlStroke (long) 2                            // 按每个字符中的笔画数进行排序

VARIANT key1; // these lines set up first arg (key1) to sort

V_VT(&key1) = VT_DISPATCH;                           // 排序时,关键字的vt设置为VT_DISPATCH

V_DISPATCH(&key1) = sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1"));   // 设置按哪个关键字进行排序 选择单元意为:按此列(或行)为主关键字进行排序

range=sheet.GetRange(COleVariant(L"A1"),COleVariant(CellName));              // 选择对哪些区域内的单元格进行排序

range.Sort(key1, xlAscending, vOpt, vOpt, xlAscending, vOpt,xlAscending,xlNoHeader,vOpt,xlIgnoreCase,xlTopToBottom,xlPinYin); //设置排序 无标题时一定要设置为xlNoHeader  否则不起作用

选择篇

1 选择单元格

//选择一个单元格

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

//选择多个单元格

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

//使用变量表示单元格

CString CellName;

Int i=1;j=1;

CellName.Format(_T(“%c%d”),j+64,i);   //A–Z  65-90

//加载单元格

rnge.AttachDispatch(range.GetRange(COleVariant(CellName),COleVariant(CellName)));

2 选择某行

 

1)

//选择第一行

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV1"))),TRUE);

//选择前5行

range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV5"))),TRUE);

2)先选择某行中的某个单元格,然后再选择整行

Range rows;

rows.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

rows=rows.GetEntireRow();

3)获得所有的行,然后再选择指定行

Range rows;

range.AttachDispatch(sheet.GetRows(),TRUE);

//选择第一行

rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

rows.SetRowHeight(COleVariant((long)60));

3 选择某一列

 

1)

range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A65536")));  //第一列

2)先选择某列中的某个单元格,然后再选择整列

range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1")));  //第一列

range=range.GetEntireColumn();

3)先获得所有列,然后再选择某一列

//获得所有列

range.AttachDispatch(sheet.GetColumns(),true);

//选择第一列

range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

4 选择全部CELLS

range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

5 选择已使用的单元格

range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

6 获取单元格的值

1)

range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

COleVariant rValue;
rValue=COleVariant(range.GetValue());
rValue.ChangeType(VT_BSTR);
this->MessageBox(CString(rValue.bstrVal));

2)

//读取第一个单元格的值

range.AttachDispatch(sheet.GetCells());

range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

vResult =range.GetValue();

CString str;

if(vResult.vt == VT_BSTR)       //字符串

{

str=vResult.bstrVal;

}

else if (vResult.vt==VT_R8)     //8字节的数字

{

str.Format(L"%f",vResult.dblVal);

}

else if(vResult.vt==VT_DATE)    //时间格式

{

SYSTEMTIME st;

VariantTimeToSystemTime((long)&vResult.date, &st);

}

else if(vResult.vt==VT_EMPTY)   //单元格空的

{

str="";

}

读取xls文件示例 :

//变量定义

_Application app;          //Excel应用程序接口

Workbooks books;         //工作薄集合

_Workbook book;          //工作薄

Worksheets sheets;         //工作表集合

_Worksheet sheet;          //工作表

Range range;                 //Excel中针对单元格的操作都应先获取其对应的Range对象

Font font;

Range cols;

Range iCell;

LPDISPATCH lpDisp;

COleVariant vResult;

COleVariant

covTrue((short)TRUE),

covFalse((short)FALSE),

covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

//初始化

if( !app.CreateDispatch(L"Excel.Application") ){

this->MessageBox(L"无法创建Excel应用!");

return;

}

app.SetVisible(TRUE);     //可见

app.SetUserControl(TRUE); //用户可控制

//打开XLS文件

books.AttachDispatch(app.GetWorkbooks());

lpDisp = books.Open(L"d:\\3.xls",

covOptional, covOptional, covOptional, covOptional, covOptional,

covOptional, covOptional, covOptional, covOptional, covOptional,

covOptional, covOptional );

//得到Workbook

book.AttachDispatch(lpDisp);

//得到Worksheets

sheets.AttachDispatch(book.GetWorksheets());

//得到当前活跃sheet

//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待

lpDisp=book.GetActiveSheet();

sheet.AttachDispatch(lpDisp);

//*****

//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列

Range usedRange;

usedRange.AttachDispatch(sheet.GetUsedRange());

range.AttachDispatch(usedRange.GetRows());

long iRowNum=range.GetCount();                   //已经使用的行数

range.AttachDispatch(usedRange.GetColumns());

long iColNum=range.GetCount();                   //已经使用的列数

long iStartRow=usedRange.GetRow();               //已使用区域的起始行,从开始

long iStartCol=usedRange.GetColumn();            //已使用区域的起始列,从开始

//读取第一个单元格的值

range.AttachDispatch(sheet.GetCells());

range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

vResult =range.GetValue();

CString str;

if(vResult.vt == VT_BSTR)       //字符串

{

str=vResult.bstrVal;

}

else if (vResult.vt==VT_R8)     //8字节的数字

{

str.Format(L"%f",vResult.dblVal);

}

else if(vResult.vt==VT_DATE)    //时间格式

{

SYSTEMTIME st;

VariantTimeToSystemTime((long)&vResult.date, &st);

}

else if(vResult.vt==VT_EMPTY)   //单元格空的

{

str="";

}

//读取第一个单元格的对齐方式,数据类型:VT_I4

//读取水平对齐方式

range.AttachDispatch(sheet.GetCells());

iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);

vResult.lVal=0;

vResult=iCell.GetHorizontalAlignment();

if(vResult.lVal!=0)

{

switch (vResult.lVal)

{

case 1:      //默认

break;

case -4108:  //居中

break;

case -4131 : //*左

break;

case -4152 : //*右

break;

}

}

//垂直对齐方式

iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);

vResult.lVal=0;

vResult=iCell.GetVerticalAlignment();

if(vResult.lVal!=0)

{

switch (vResult.lVal)

{

case -4160 :  //*上

break;

case -4108 :  //居中

break;

case -4107 :  //*下

break;

}

}

//设置第一个单元格字体颜色:红色

range.AttachDispatch(sheet.GetCells());

range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);

font.AttachDispatch(range.GetFont());

font.SetColor(COleVariant((long)0xFF0000));

//合并单元格的处理

//包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并

Range unionRange;

range.AttachDispatch(sheet.GetCells());

unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

vResult=unionRange.GetMergeCells();

if(vResult.boolVal==-1)             //是合并的单元格

{

//合并单元格的行数

range.AttachDispatch (unionRange.GetRows ());

long iUnionRowNum=range.GetCount ();

//合并单元格的列数

range.AttachDispatch (unionRange.GetColumns ());

long iUnionColumnNum=range.GetCount ();

//合并区域的起始行,列

long iUnionStartRow=unionRange.GetRow();       //起始行,从开始

long iUnionStartCol=unionRange.GetColumn();    //起始列,从开始

}

else if(vResult.boolVal==0)

{

//不是合并的单元格

}

//将第一个单元格合并成行,列

range.AttachDispatch(sheet.GetCells());

unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); //第一个单元格

unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)3),COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格

unionRange.Merge(COleVariant((long)0));   //合并单元格

//将文件保存为.xls

book.SaveAs(COleVariant(L"C:\\2.xls"),covOptional,covOptional,

covOptional,covOptional,covOptional,0,

covOptional,covOptional,covOptional,covOptional);

book.Close (covOptional,COleVariant(L"d:\\3.xls"),covOptional);

books.Close();

//释放对象(相当重要!)

range.ReleaseDispatch();

cols.ReleaseDispatch();

sheet.ReleaseDispatch();

sheets.ReleaseDispatch();

book.ReleaseDispatch();

books.ReleaseDispatch();

//App一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错

app.ReleaseDispatch();

app.Quit();

一、加载

1、 在VC6.0里创建一个MFC工程

2、打开MFCClassWizard窗口(查看—>建立类向导),选择Automation,单击AddClass按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图。

 
 

3 、返回编辑器,查看工程文件,可发现多了 EXCEL.9H 及 EXCEL9.CPP 两个文件,拷贝出来,放在 VS2005 需要使用excel的工程文件中。

4. 打开stdafx.h头文件确保包含如下头文件:

#include <afxdisp.h>(这个一般有了)

#include "excel.h" (手动添加这个即可)

5. 打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:

if(!AfxOleInit() ){

AfxMessageBox("初始化Ole出错!");

return FALSE;

}

为保证编译时不产生重复定义错误(可以验证一下是否成功加载,没有也能正常执行),我编译时出现了很多“类重复定义”异常,打开excel.h文件,在文件开始位置加入如下代码:

#if !defined _HEAD_FILE_EXCEL9_

#define _HEAD_FILE_EXCEL9_

相应的,在文件末尾加入:

#endif

成功

Excel接口

导入类

头文件

说明

_Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作。

在MSDN中,很少有excel方面的资料,但是在http://msdn.microsoft.com/zh-cn/ms348103.aspx中可以找到C#控制EXCEL方面的说明

二、操作EXCEL文件

1. 新建一个excel表,并填充两个单元格的实例

[cpp] view plain copy print ?
  1. void CTestExcelDlg::OnButton1()
  2. {
  3. //Workbooks—>Workbook —>Worksheets—>Worksheet —>Range
  4. _Application app;       //Excel应用程序接口
  5. Workbooks books;        //工作薄集合
  6. _Workbook book;     //工作薄
  7. Worksheets sheets;      //工作表集合
  8. _Worksheet sheet;       //工作表
  9. Range range;            //Excel中针对单元格的操作都应先获取其对应的Range对象
  10. Font font;
  11. Range cols;
  12. /*
  13. COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用
  14. VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant
  15. 类来转换了的。
  16. */
  17. //covOptional 可选参数的VARIANT类型
  18. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  19. if( !app.CreateDispatch("Excel.Application") ){
  20. this->MessageBox("无法创建Excel应用!");
  21. return;
  22. }
  23. //获取工作薄集合
  24. books=app.GetWorkbooks();
  25. //添加一个工作薄
  26. book=books.Add(covOptional);
  27. //获取工作表集合
  28. sheets=book.GetSheets();
  29. //获取第一个工作表
  30. sheet=sheets.GetItem(COleVariant((short)1));
  31. //选择工作表中A1:A1单元格区域
  32. range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
  33. //设置A1=HELLO EXCEL!"
  34. range.SetValue(COleVariant("HELLO EXCEL!"));
  35. //调整格式,设置粗体
  36. font=range.GetFont();
  37. font.SetBold(COleVariant((short)TRUE));
  38. //选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形
  39. range=sheet.GetRange(COleVariant("A2"),COleVariant("A2"));
  40. range.SetFormula(COleVariant("=RAND()*100000"));
  41. range.SetNumberFormat(COleVariant("$0.00"));
  42. //选择A:A列,设置宽度为自动适应
  43. cols=range.GetEntireColumn();
  44. cols.AutoFit();
  45. //显示Excel表格,并设置状态为用户可控制
  46. app.SetVisible(TRUE);
  47. app.SetUserControl(TRUE);

2. 打开一个已有的excel表格实例

[cpp] view plain copy print ?
  1. CString strPath;
  2. strPath += "C:\\template.xlt"; // 模板的路径
  3. CFileFind filefind;
  4. if( !filefind.FindFile( strPath ) )
  5. {
  6. AfxMessageBox( "没有找到模版文档,请其查找" );
  7. return;
  8. }
  9. LPDISPATCH lpDisp;  //接口指针
  10. books=app.GetWorkbooks();
  11. lpDisp = books.Open(m_filepath,
  12. covOptional, covOptional, covOptional, covOptional,
  13. covOptional, covOptional, covOptional, covOptional,
  14. covOptional, covOptional, covOptional, covOptional,
  15. covOptional, covOptional
  16. );                  //与的不同,是个参数的,直接在后面加了两个covOptional成功了
  17. book.AttachDispatch(lpDisp);

3. 保存一个excel文件实例

[cpp] view plain copy print ?
  1. book.SetSaved(TRUE);

4. 另存一个excel文件实例

[cpp] view plain copy print ?
  1. book.SaveAs(COleVariant(m_filename),covOptional,
  2. covOptional,covOptional,
  3. covOptional,covOptional,(long)0,
  4. covOptional,covOptional,covOptional,
  5. covOptional,covOptional); //与的不同,是个参数的,直接在后面加了两个covOptional成功了

5. 释放一个excel文件实例

经试验证实,不释放第二次使用excel时会中断,放在类的析构里面有时调用不到,主动调用最保险。(有没有AttachDispatch()过都要释放,否则报错)

[cpp] view plain copy print ?
  1. //释放对象(相当重要!)
  2. Rang.ReleaseDispatch();
  3. sheet.ReleaseDispatch();
  4. sheets.ReleaseDispatch();
  5. book.ReleaseDispatch();
  6. books.ReleaseDispatch();
  7. //退出程序
  8. app.Quit();
  9. //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
  10. app.ReleaseDispatch();

6. 修改一个excel单元格

[cpp] view plain copy print ?
  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  2. range.SetValue2(COleVariant(value));

7. 取出一个excel单元格

实现Variant数据类型转换为CString类,这个只是一个示例,转换较为简单。

[cpp] view plain copy print ?
  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  2. COleVariant rValue;
  3. rValue=COleVariant(range.GetValue2());
  4. rValue.ChangeType(VT_BSTR);
  5. return CString(rValue.bstrVal);

8. 还有释放问题是最重要的问题:

   首先变量必须全释放,无论当初是否绑定过;

   其次,程序释放和程序关闭的顺序必须是

[cpp] view plain copy print ?
  1. app.Quit();
  2. app.ReleaseDispatch();
  3. 如果顺如颠倒如下:
  4. app.ReleaseDispatch();
  5. app.Quit();
  6. 出现的后果是程序关闭后,excel进程仍然运行,所以无法正常打开程序曾经打开excel表格。

附录(操作类源码):

[cpp] view plain copy print ?
  1. #include "../Stdafx.h"
  2. #include "OptExcel.h"
  3. #include "excel.h"
  4. #include "comdef.h"
  5. _Application app;
  6. Workbooks books;
  7. _Workbook book;
  8. Worksheets sheets;
  9. _Worksheet sheet;
  10. Range range;
  11. Range cell;
  12. Font font;
  13. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  14. ///Function:    COptExcel
  15. ///Description: 初始化函数,初始化中附加excel应用程序
  16. ///Call:        app.CreateDispatch(_T("Excel.Application")
  17. COptExcel::COptExcel(void)
  18. {
  19. if (::CoInitialize( NULL ) == E_INVALIDARG)
  20. {
  21. AfxMessageBox(_T("初始化Com失败!"));
  22. return;
  23. }
  24. //验证office文件是否可以正确运行
  25. if( !app.CreateDispatch(_T("Excel.Application")) )
  26. {
  27. AfxMessageBox(_T("无法创建Excel应用!"));
  28. return;
  29. }
  30. //在程序执行文件路径名中,剪掉执行文件名,得到程序路径,追加模板文件名,得到模板完整路径
  31. }
  32. ///Function:    ~COptExcel
  33. ///Description: 析构函数,释放对象,非常重要,不全部释放,占用内存,下
  34. ///             一次使用此类时会中断
  35. ///Call:        ReleaseDispatch()
  36. COptExcel::~COptExcel(void)
  37. {
  38. books.ReleaseDispatch();
  39. book.ReleaseDispatch();
  40. sheets.ReleaseDispatch();
  41. sheet.ReleaseDispatch();
  42. range.ReleaseDispatch();
  43. font.ReleaseDispatch();
  44. cell.ReleaseDispatch();
  45. app.Quit();
  46. app.ReleaseDispatch();
  47. ::CoUninitialize();
  48. }
  49. ///Function:    OpenExcelBook
  50. ///Description: 打开表名为filename的文件,注意,文件路径非自动生成,以后
  51. ///             考虑从下处理方法
  52. ///Call:        GetAppPath()
  53. ///Input:       CString filename 文件名
  54. bool COptExcel::OpenExcelBook(CString filename)
  55. {
  56. CFileFind filefind;
  57. if( !filefind.FindFile(filename) )
  58. {
  59. AfxMessageBox(_T("文件不存在"));
  60. return false;
  61. }
  62. LPDISPATCH lpDisp; //接口指针
  63. books=app.GetWorkbooks();
  64. lpDisp = books.Open(filename,
  65. covOptional, covOptional, covOptional, covOptional,
  66. covOptional, covOptional, covOptional, covOptional,
  67. covOptional, covOptional, covOptional, covOptional,
  68. covOptional, covOptional
  69. );                                      //与office 2000的不同,是个参数的,直接在后面加了两个covOptional成功了
  70. book.AttachDispatch(lpDisp);
  71. sheets=book.GetSheets();
  72. sheet=sheets.GetItem(COleVariant((short)1));        //与的不同,是个参数的,直接在后面加了两个covOptional成功了
  73. return true;
  74. }
  75. void COptExcel::NewExcelBook()
  76. {
  77. books=app.GetWorkbooks();
  78. book=books.Add(covOptional);
  79. sheets=book.GetSheets();
  80. sheet=sheets.GetItem(COleVariant((short)1));        //与的不同,是个参数的,直接在后面加了两个covOptional成功了
  81. }
  82. ///Function:    OpenExcelApp
  83. ///Description: 打开应用程序(要注意以后如何识别用户要打开的是哪个文件)
  84. void COptExcel::OpenExcelApp(void)
  85. {
  86. app.SetVisible(TRUE);
  87. app.SetUserControl(TRUE);
  88. }
  89. ///Function:    SaveExcel
  90. ///Description: 用于打开数据文件,续存数据后直接保存
  91. void COptExcel::SaveExcel(void)
  92. {
  93. book.SetSaved(TRUE);
  94. }
  95. ///Function:    SaveAsExcel
  96. ///Description: 保存excel文件
  97. void COptExcel::SaveAsExcel(CString filename)
  98. {
  99. book.SaveAs(COleVariant(filename),covOptional,
  100. covOptional,covOptional,
  101. covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,
  102. covOptional,covOptional);
  103. }
  104. ///Function:    SetCellValue
  105. ///Description: 修改单元格内的值
  106. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  107. ///Input:       int row 单元格所在行
  108. ///             int col 单元格所在列
  109. ///             int Align       对齐方式默认为居中
  110. void COptExcel::SetCellValue(int row, int col,int Align)
  111. {
  112. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  113. range.SetValue2(COleVariant(value));
  114. cell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
  115. cell.SetHorizontalAlignment(COleVariant((short)Align));
  116. }
  117. ///Function:    GetCellValue
  118. ///Description: 得到的单元格中的值
  119. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  120. ///Input:       int row 单元格所在行
  121. ///             int col 单元格所在列
  122. ///Return:      CString 单元格中的值
  123. CString COptExcel::GetCellValue(int row, int col)
  124. {
  125. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  126. COleVariant rValue;
  127. rValue=COleVariant(range.GetValue2());
  128. rValue.ChangeType(VT_BSTR);
  129. return CString(rValue.bstrVal);
  130. }
  131. ///Function:    SetRowHeight
  132. ///Description: 设置行高
  133. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  134. ///Input:       int row 单元格所在行
  135. void COptExcel::SetRowHeight(int row, CString height)
  136. {
  137. int col = 1;
  138. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  139. range.SetRowHeight(COleVariant(height));
  140. }
  141. ///Function:    SetColumnWidth
  142. ///Description: 设置列宽
  143. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  144. ///Input:       int col 要设置列宽的列
  145. ///             CString 宽值
  146. void COptExcel::SetColumnWidth(int col,CString width)
  147. {
  148. int row = 1;
  149. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  150. range.SetColumnWidth(COleVariant(width));
  151. }
  152. ///Function:    SetRowHeight
  153. ///Description: 设置行高
  154. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  155. ///Input:       int row 单元格所在行
  156. CString COptExcel::GetColumnWidth(int col)
  157. {
  158. int row = 1;
  159. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  160. VARIANT width = range.GetColumnWidth();
  161. CString strwidth;
  162. strwidth.Format(CString((LPCSTR)(_bstr_t)(_variant_t)width));
  163. return strwidth;
  164. }
  165. ///Function:    GetRowHeight
  166. ///Description: 设置行高
  167. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串
  168. ///Input:       int row 要设置行高的行
  169. ///             CString 宽值
  170. CString COptExcel::GetRowHeight(int row)
  171. {
  172. int col = 1;
  173. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));
  174. VARIANT height = range.GetRowHeight();
  175. CString strheight;
  176. strheight.Format(CString((LPCSTR)(_bstr_t)(_variant_t)height));
  177. return strheight;
  178. }
  179. ///Function:    IndexToString
  180. ///Description: 得到的单元格在EXCEL中的定位名称字符串
  181. ///Input:       int row 单元格所在行
  182. ///             int col 单元格所在列
  183. ///Return:      CString 单元格在EXCEL中的定位名称字符串
  184. CString COptExcel::IndexToString( int row, int col )
  185. {
  186. CString strResult;
  187. if( col > 26 )
  188. {
  189. strResult.Format(_T("%c%c%d"),'A' + (col-1)/26-1,'A' + (col-1)%26,row);
  190. }
  191. else
  192. {
  193. strResult.Format(_T("%c%d"), 'A' + (col-1)%26,row);
  194. }
  195. return strResult;
  196. }
  197. ///Function:    LastLineIndex
  198. ///Description: 得到表格总第一个空行的索引
  199. ///Return:      int 空行的索引号
  200. int COptExcel::LastLineIndex()
  201. {
  202. int i,j,flag=0;
  203. CString str;
  204. for(i=1;;i++)
  205. {
  206. flag = 0;
  207. //粗略统计,认为前列都没有数据即为空行
  208. for(j=1;j<=5;j++)
  209. {
  210. str.Format(_T("%s"),this->GetCellValue(i,j).Trim());
  211. if(str.Compare(_T(""))!=0)
  212. {
  213. flag = 1;
  214. break;
  215. }
  216. }
  217. if(flag==0)
  218. return i;
  219. }
  220. }

1.     VS2005添加COM

Project-> addclass -> MFC -> MFC CLASS FROM TypeLib

选择:_Application/_Workbook/_Worksheet/Workbooks/Worksheet/Range

点击finish 后生成

CApplication.h

CWorkbook.h

CWorkbooks.h

CWorksheet.h

CWorksheets.h

CRange.h

删掉这些文件,导入excel9.h,excel9.cpp

[cpp] view plain copy print ?
  1. <strong>2.  在对应的程序文件中添加头文件#include "excel9.h"
  2. 在程序中启用COM服务库</strong>
  3. // 初始化 OLE 库
  4. if (!AfxOleInit())
  5. {
  6. AfxMessageBox(L"Could not initialize COM dll");
  7. return FALSE;
  8. }
  9. if (CoInitialize(NULL) != S_OK)
  10. return -1;
  11. <strong>下面是一个处理EXCEL的程序例子,可直接调用:</strong>
  12. void OnBnClickedButtonCaln()
  13. {
  14. // TODO: 在此添加控件通知处理程序代码
  15. // TODO: Add your control notification handler code here
  16. Range m_ExlRge;
  17. _Worksheet m_ExlSheet;
  18. Worksheets m_ExlSheets;
  19. _Workbook m_ExlBook;
  20. Workbooks m_ExlBooks;
  21. _Application m_ExlApp;
  22. //用m_ExlApp对象创建Excel2003进程
  23. if(!m_ExlApp.CreateDispatch(_T("Excel.Application"),NULL))
  24. {
  25. AfxMessageBox(_T("创建Excel服务失败!"));
  26. return;
  27. }
  28. //设置为可见
  29. m_ExlApp.SetVisible(TRUE);
  30. ///下面得到应用程序所在的路径///
  31. CString theAppPath,theAppName;
  32. //  char Path[MAX_PATH];
  33. //  GetModuleFileName(NULL,Path,MAX_PATH);//得到应用程序的全路径
  34. GetModuleFileName(NULL,_T("D:\\1.xlt"),MAX_PATH);//得到应用程序的全路径
  35. //theAppPath=(CString)Path;
  36. theAppPath=_T("D:\\1.xlt");
  37. theAppName=AfxGetApp()->m_pszAppName;
  38. theAppName+=_T(".exe");
  39. //把最后的文件名去掉
  40. int length1,length2;
  41. length1=theAppPath.GetLength();
  42. length2=theAppName.GetLength();
  43. theAppPath.Delete(length1-length2,length2);
  44. CString TempPath=_T("");
  45. //TempPath=theAppPath+_T("Template.xls");//EXCEL模板的路径
  46. TempPath=theAppPath;
  47. m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);
  48. m_ExlBook.AttachDispatch(m_ExlBooks.Add((COleVariant)TempPath),TRUE);//加载EXCEL模板
  49. m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面
  50. //添加新的Sheet页面
  51. m_ExlSheets.Add(vtMissing,vtMissing,COleVariant((long)1),vtMissing);
  52. //删除第二个Sheet页面
  53. m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(COleVariant((long)2)),TRUE);
  54. m_ExlSheet.Delete();
  55. //把第一个Sheet页面的名字改变为TestSheet
  56. m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(COleVariant((long)1)),TRUE);
  57. m_ExlSheet.SetName(_T("TestSheet"));
  58. ///合并第一行单元格A1至D1//
  59. //加载要合并的单元格
  60. m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);
  61. m_ExlRge.Merge(COleVariant((long)0));
  62. 设置表格内容
  63. m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//加载所有单元格
  64. m_ExlRge.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计")));
  65. m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名")));
  66. m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("课时")));
  67. m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)3),COleVariant(_T("难度")));
  68. m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)4),COleVariant(_T("教学方式")));
  69. m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)1),COleVariant(_T("泛函分析")));
  70. m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)2),COleVariant(_T("60")));
  71. m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)3),COleVariant(_T("普通")));
  72. m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)4),COleVariant(_T("老师讲课")));
  73. m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)1),COleVariant(_T("微分流形")));
  74. m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)2),COleVariant(_T("40")));
  75. m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)3),COleVariant(_T("变态难")));
  76. m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)4),COleVariant(_T("自学")));
  77. m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)1),COleVariant(_T("二阶椭圆型方程与方程组")));
  78. m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)2),COleVariant(_T("60")));
  79. m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)3),COleVariant(_T("很难")));
  80. m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)4),COleVariant(_T("讨论")));
  81. m_ExlRge.AttachDispatch(m_ExlSheet.GetUsedRange());//加载已使用的单元格
  82. m_ExlRge.SetWrapText(COleVariant((long)1));//设置单元格内的文本为自动换行
  83. //设置齐方式为水平垂直居中
  84. //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152
  85. //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107
  86. m_ExlRge.SetHorizontalAlignment(COleVariant((long)-4108));
  87. m_ExlRge.SetVerticalAlignment(COleVariant((long)-4108));
  88. ///设置整体的字体、字号及颜色//
  89. Font ft;
  90. ft.AttachDispatch(m_ExlRge.GetFont());
  91. ft.SetName(COleVariant(_T("宋体")));//字体
  92. ft.SetColorIndex(COleVariant((long)11));//字的颜色
  93. ft.SetSize(COleVariant((long)12));//字号
  94. ///设置标题字体及颜色//
  95. m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))));
  96. ft.AttachDispatch(m_ExlRge.GetFont());
  97. ft.SetBold(COleVariant((long)1));//粗体
  98. ft.SetSize(COleVariant((long)13));
  99. ft.SetColorIndex(COleVariant((long)2));
  100. //  CellFormat cf;
  101. //  cf.AttachDispatch(m_ExlRge.GetCells());
  102. //设置底色/
  103. Interior it;
  104. it.AttachDispatch(m_ExlRge.GetInterior());
  105. it.SetColorIndex(COleVariant((long)11));//标题底色
  106. 表格内容的底色
  107. m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));
  108. it.AttachDispatch(m_ExlRge.GetInterior());
  109. it.SetColorIndex(COleVariant((long)15));
  110. //为表格设置边框/
  111. Range UnitRge;
  112. CString CellName;
  113. for(int i=1;i<=4;i++)
  114. {
  115. for(int j=1;j<=4;j++)
  116. {
  117. CellName.Format(_T("%c%d"),j+64,i);//单元格的名称
  118. UnitRge.AttachDispatch(m_ExlRge.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格
  119. //LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动)
  120. UnitRge.BorderAround(COleVariant((long)1),(long)2,((long)-4105),vtMissing);//设置边框
  121. }
  122. }
  123. //释放对象(相当重要!)
  124. m_ExlRge.ReleaseDispatch();
  125. m_ExlSheet.ReleaseDispatch();
  126. m_ExlSheets.ReleaseDispatch();
  127. m_ExlBook.ReleaseDispatch();
  128. m_ExlBooks.ReleaseDispatch();
  129. //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
  130. m_ExlApp.ReleaseDispatch();
  131. //退出程序 m_ExlApp.Quit();
  132. }

excel之单元格格式/设置/相关推荐

  1. WPS——excel单元格格式设置笔记(小白)

    单元格格式设置笔记 选中某一个单元格,按下快捷键Ctrl+1,或者单击鼠标右键,选择设置单元格格式,就可以弹出该卡片啦.如下图共有6个小模块,下面我们一一介绍: 1.数字选项卡 分为12个小类:常规, ...

  2. 王佩丰第2讲-excel单元格格式设置 笔记

    点小箭头都可以进入单元格格式设置 跨越合并 添加斜线 回车 ALT+ENTER 格式刷 数字格式 特定红色 货币VS会计专用 日期 2是1月2号,3是1月3号-- 自定义[例子中是在数值后面加&quo ...

  3. 第二讲-单元格格式设置

    单元格格式设置(2016版) 1.合并单元格 1.选中要合并的单元格 2.鼠标点击开始->合并后居中,如果不想居中点击旁边向下箭头,然后点击合并单元格 2.边框线颜色 注意若不设置,打印不会有边 ...

  4. 计算机一级考试wps知识点,2018年计算机一级考试WPS辅导知识:表格单元格格式设置方法...

    2018年3月计算机等级考试即将开始,小编在这里为考生们整理了2018年计算机一级考试WPS辅导知识,希望能帮到大家,想了解更多资讯,请关注出国留学网的及时更新哦. 2018年计算机一级考试WPS辅导 ...

  5. java设置单元格格式_java报表开发之单元格格式设置

    // 设置水平居中 style = style.deriveHorizontalAlignment(Constants.CENTER); 1.6 设置单元格边框 设置边框样式和边框颜色 style = ...

  6. 王佩丰Excel24讲_第2讲:excel单元格格式设置

    文章目录 一.使用单元格格式工具美化表格 1.设置单元格格式 2.合并单元格 3.表格中的斜线如何设置 4.格式刷 二.单元格数字格式 1.数字格式 3.利用数字格式隐藏数据 4.数字格式学习表 三. ...

  7. POI导出EXCEL带水印 以及单元格格式设置

    客户提个需求,需要将报表导出 excel带水印 和 pdf带水印 2个版本. 做的时候连excel本身怎么带水印都不知道,更不用说用java了.后来在网上搜到了excel添加水印的2个方法. 1.艺术 ...

  8. Excel单元格格式设置——日期型切换语种

    单元格格式代码含义及示例 日期相关格式代码 代码 含义 示例数据 示例代码 显示效果 yy 两位数字年份 1999/1/1 yy 99 yyyy 四位数字年份月份 2010/1/1 yyyy 2010 ...

  9. 每日excel学习之单元格格式设置

    一.使用单元格格式工具美化表格 1.设置单元格格式 2.文字对齐方式 3.单元格边框 4.设置字体颜色 5.设置单元格背景颜色 6.例题:设置单元格<机械手表汇总>合并单元格并居中对齐,设 ...

最新文章

  1. 计算机组装cpu用哪种好,教你电脑处理器哪款好
  2. 《偷梁换柱》全世界最最简单对付SMSS。EXE病毒的方法,可能也是对付某类流氓程序的好方法...
  3. 这8种经常被忽视的SQL错误用法,你踩过几个?
  4. Python 技术篇-设置windows开机自动启用Jupyter服务,BAT批处理脚本启用jupyter服务设置,设置jupyter默认启动位置的方法
  5. 【视频】vue单文件组件vue-cli
  6. 明科在线客服系统PHP_在线客服系统的标准功能有哪些
  7. python实现etl_为什么选择R而不是Python做ETL
  8. deepin系统15.6版本安装执行那个exe文件_深度系统(Deepin Linux)U盘安装教程
  9. kali linux之选择和修改exp与windows后渗透
  10. 关于SQL语句中的双引号、单引号和
  11. 请检查 mysql 模块是否正确加载_mysql_connect() 不支持 请检查 mysql 模块是否正确加载...
  12. 学习linux心得,linux学习心得范文
  13. niosii spi 外部_【笔记】NIOS II spi详解
  14. Nginx文件系统:xxx-available文件与xxx-enabled文件的区别
  15. 聊下如何设计知识中台?(附代码)
  16. 巴菲特致股东的一封信:1990年
  17. 计算机组成原理基础知识点
  18. iOS开发者,金九银十,这样写简历才能让大厂面试官看重你!
  19. 互斥事件的概念和公式_统计学中的基本概念和重要公式(一)
  20. 换帅缘于投入 SAP中国新总裁上手仍需时间

热门文章

  1. 他山之石,可以攻玉:认知科学中的迭代模型,何以缓解语言迁移
  2. 欧拉计划(project euler)最详细中文题解
  3. Lévy State-Space Models for Tracking and Intent Predictionof Highly Maneuverable Objects
  4. 用Python实现Le'vy flight
  5. 汉字转换成NCR编码的字符
  6. Burp Suite入门介绍
  7. aiwi最新游戏:黑色洛城
  8. 《Team Geek: A Software Developer's Guide to Working Well with Others》读书笔记(三)
  9. 游戏运营岗位的相关知识点
  10. 同时用公司内网和手机热点上网(真的有用!)