VC操作Excel文件保存问题
用VC对Excel文件进行写操作后,在程序结束前需要对一些对象进行收尾工作,如调用_Workbook::Save()方法(该方法是Microsoft提供的供VC调用的对Excel文件操作的标准方法,在文件excel9.cpp或excel.cpp中定义)保存文件。
问题就出现在这里,若选取要保存的Excel文件以前不存在则程序创建一个同名的空Excel文件,对Excel表的操作实际是对其同名副本的操作,Save()方法会触发一个"另存为"的对话框,需要覆盖原来同名的空Excel文件,否则写入Excel的数据会丢失。若选取的Excel文件已经存在,则调用Save()方法不会触发"另存为"对话框,系统会自动保存写到Excel中的数据。
需要说明的是,在调用Save()前,已经调用过SetAlertBeforeOverwriting(FALSE)和SetDisplayAlerts(FALSE)关掉一些警告窗口了。若调用SaveAs()方法,虽不会触发"另存为"对话框,但会出抛出“找不到成员”的错误,这时保存写好的Excel文件后并重新打开发现数据还是丢失。
想尽所有办法,可总无法去掉那个讨厌的"另存为"对话框,请各位大虾帮忙。多谢了!
SaveAs()是excelapp的方法吗。
xlApp.ActiveWorkbook.SaveAs "C:\excel.xls"
xlApp.Quit
我的没有问题。
如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。利用Automation技术,我们可以在不去了解
数据库的情况下玩转Excel,而且你会发现一切竟如此轻松!
好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,
包括启动Excel,读取数据,写入数据,以及最后的关闭Excel,其中还包括了很多人感兴趣的合并单元格的处理。
特别说明以下代码需要MFC的支持,而且工程中还要包含EXCEL2000的定义文件:EXCEL9.H,EXCEL9.CPP
*****************************************************************************************************************
//*****
//变量定义
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
Range iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//*****
//初始化COM的动态连接库
if(!AfxOleInit())
{
AfxMessageBox("无法初始化COM的动态连接库!");
return ;
}
//*****
//创建Excel 2000服务器(启动Excel)
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("无法启动Excel服务器!");
return;
}
app.SetVisible(TRUE); //使Excel可见
app.SetUserControl(TRUE); //允许其它用户控制Excel
//*****
//打开c:\\1.xls
books.AttachDispatch(app.GetWorkbooks());
lpDisp = books.Open("C:\\\\1.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(); //已使用区域的起始行,从1开始
long iStartCol=usedRange.GetColumn(); //已使用区域的起始列,从1开始
//*****
//读取第一个单元格的值
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
COleVariant vResult =range.GetValue();
CString str;
if(vResult.vt == VT_BSTR) //字符串
{
str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8) //8字节的数字
{
str.Format("%f",vResult.dblVal);
}
else if(vResult.vt==VT_DATE) //时间格式
{
SYSTEMTIME st;
VariantTimeToSystemTime(&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;
}
}
//*****
//设置第一个单元格的值"HI,EXCEL!"
range.SetItem(COleVariant(1),COleVariant(1),COleVariant("HI,EXCEL!"));
//*****
//设置第一个单元格字体颜色:红色
Font font;
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
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(); //起始行,从1开始
long iUnionStartCol=unionRange.GetColumn(); //起始列,从1开始
}
else if(vResult.boolVal==0)
{//不是合并的单元格}
//将第一个单元格合并成2行,3列
range.AttachDispatch(sheet.GetCells());
unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2),COleVariant((long)3)));
unionRange.Merge(COleVariant((long)0)); //合并单元格
//*****
//将文件保存为2.xls
book.SaveAs(COleVariant("C:\\\\2.xls"),covOptional,covOptional, \\
covOptional,covOptional,covOptional,0,\\
covOptional,covOptional,covOptional,covOptional);
//*****
//关闭所有的book,退出Excel
book.Close (covOptional,COleVariant(OutFilename),covOptional);
books.Close();
app.Quit();
// Excel保存
Sheet.OleProcedure("SaveAs", FName.c_str());
www.ccrun.com里面有说道。
学习
posted @
2005-05-25 10:05 子玉 阅读(2210) |
评论 (0) |
编辑 收藏
为了能使得输出到Excel中的数据显示表格,可以调用事先设置好的模板,但是不灵活。我花了一个中午的时间摸索出如何设置它了。
具体代码如下:
LPDISPATCH pRange;
CString cell;
int c,c1,c2;
_variant_t vRange1; // 设置单元格的线;
_variant_t vRange2;
_variant_t vRange3;
_variant_t vRange4;
c='A';
c1=j/26;
c2=j%26;
if(c1==0)
cell.Format("%c%d",c2+c,i+1); // i+1 :表示从第二行开始关联
else
cell.Format("%c%c%d",c1+c-1,c2+c-1,i+1);
VERIFY(pRange = m_worksheet.GetRange(COleVariant(cell)));
m_range.AttachDispatch(pRange);
//对齐方式
Var.vt = VT_I2;
Var.iVal=-4108;
m_range.SetHorizontalAlignment(Var);
m_range.SetVerticalAlignment(Var);
//
// 设置单元格的线;
vRange1.vt =VT_I2;
vRange1.lVal =1; // 线的样式:0- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot;
vRange2.vt =VT_I2;
vRange2.lVal =3; // 线的粗细程度;
vRange3.vt =VT_I2;
vRange3.lVal =1; // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue;
vRange4.vt = VT_UI4;
vRange4.uintVal =RGB(0,0,0); // 我测试后认为,没有实际意义,只有vRange3起作用
m_range.BorderAround(vRange1,vRange2,vRange3,vRange4);
//
//
strValue=m_book.GetTextRC(i,j+2);
strValue.TrimLeft(" ");
strValue.TrimRight(" ");
if(!strValue.IsEmpty())
{
m_range.SetValue(COleVariant(strValue));
}
m_range.ReleaseDispatch();
//
虽然没有什么高深的技术含量,只是为了让后面需要的人少走点弯路。
不当之处,还望指正。
posted @
2005-05-25 10:04 子玉 阅读(836) |
评论 (1) |
编辑 收藏
feijipaopao 于 2004年 08月30日 发表
cron命令
前面介绍的两条命令都会在一定时间内完成一定任务,但是要注意它们都只能执行
一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了。但是在很多时候需要不断重复一些命令,比如:某公司每周一自动向员工报告头
一周公司的活动情况,这时候就需要使用cron命令来完成任务了。
实际上,cron命令是不应该手工启动的。cron
命令在系统启动时就由一个shell脚本自动启动,进入后台(所以不需要使用&符号)。一般的用户没有运行该命令的权限,虽然超级用户可以手工启
动cron,不过还是建议将其放到shell脚本中由系统自行启动。
首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将
载入内存。例如一个用户名为foxy的用户,它所对应的crontab文件就应该是/var/spool/cron/foxy。也就是说,以该用户命名的
crontab文件存放在/var/spool/cron目录下面。cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。
cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入“休眠”状态,释放系统资源。所以该后台进程占用资源极少。它每分钟
“醒”过来一次,查看当前是否有需要运行的命令。命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文
件中MAILTO环境变量中指定的用户。
上面简单介绍了一些cron的工作原理,但是cron命令的执行不需要用户干涉;需要用户修改的是crontab中要执行的命令序列,所以下面介绍
crontab命令。 crontab命令
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行。每
个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。
在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设有个
用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时
间。
然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:
crontab test.cron 这样一个crontab
文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab
文件。用more命令查看该文件的内容可以发现文件头有三行信息: #DO NOT EDIT THIS FILE -edit the master
and reinstall. #(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是: #切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。 #test.cron文件安装时间:14:20:20
02/22/1999 如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。
可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存在但
cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只允许
超级用户使用该命令,也可能是所有用户都可以使用该命令。 crontab命令的语法格式如下: crontab [-u user] file
crontab [-u user]{ -l|-r|-e } 第一种格式用于安装一个新的crontab
文件,安装来源就是file所指的文件,如果使用“-”符号作为文件名,那就意味着使用标准输入作为安装来源。 -u
如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项,crontab 将默认是操作者本人的crontab
,也就是执行该crontab 命令的用户的crontab 文件将被修改。但是请注意,如果使用了su命令再使用crontab
命令很可能就会出现混乱的情况。所以如果是使用了su命令,最好使用-u选项来指定究竟是哪个用户的crontab文件。 -l
在标准输出上显示当前的crontab。 -r 删除当前的crontab文件。 -e
使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。 [例7] #
crontab -l #列出用户目前的crontab。 10 6 * * * date 0 */2 * * * date 0 23-7/2,8
* * * date #
在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每
个域之间使用空格或者制表符分隔。格式如下: minute hour day-of-month month-of-year
day-of-week commands
第一项是分钟,第二项是小时,第三项是一个月的第几天,第四项是一年的第几个月,第五项是一周的星期几,第六项是要执行的命令。这些项都不能为空,必须填
入。如果用户不需要指定其中的几项,那么可以使用*代替。因为*是统配符,可以代替任何字符,所以就可以认为是任何时间,也就是该项被忽略了。在表4-1
中给出了每项的合法范围。 表4-1 指定时间的合法范围 时间 合法值 minute 00-59 hour
00-23,其中00点就是晚上12点 day-of-month 01-31 month-of-year 01-12 day-of-week
0-6,其中周日是0 这样用户就可以往crontab
文件中写入无限多的行以完成无限多的命令。命令域中可以写入所有可以在命令行写入的命令和符号,其他所有时间域都支持列举,也就是域中可以写入很多的时间
值,只要满足这些时间值中的任何一个都执行命令,每两个时间值中间使用逗号分隔。 [例8] 5,15,25,35,45,55 16,17,18 *
* * command 这就是表示任意天任意月,其实就是每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45
min、55 min时执行命令。 [例9] 在每周一,三,五的下午3:00系统进入维护状态,重新启动系统。那么在crontab
文件中就应该写入如下字段: 00 15 * * 1,3,5 shutdown -r +5
然后将该文件存盘为foxy.cron,再键入crontab foxy.cron安装该文件。 [例10]
每小时的10分,40分执行用户目录下的innd/bbslin这个指令: 10,40 * * * * innd/bbslink [例11]
每小时的1分执行用户目录下的bin/account这个指令: 1 * * * * bin/account [例12]
每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔): 20 3 * * * (/bin/rm -f expire.ls
logins.bad;bin/expire>expire.1st) [例13]
每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f
expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。 12,55 3 4-9
1,4 * /bin/rm -f expire.1st>>mm.txt [例14] 我们来看一个超级用户的crontab文件:
#Run the ‘atrun’ program every minutes #This runs anything that’s due
to run from ‘at’.See man ‘at’ or ‘atrun’.
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun 40 7 * * *
updatedb 8,10,22,30,39,46,54,58 * * * * /bin/sync
posted @
2005-05-24 11:06 子玉 阅读(421) |
评论 (0) |
编辑 收藏
浏览器的乱码问题解决(转载)
发表人:zhanxj | 发表时间: 2005年二月17日, 13:41
???? 好不容易搭建起Web服务平台,却发现浏览的时候出现乱码,手动调整着实麻烦,如何解决这种不愉快的问题呢?下面的这篇文章从方方面面的情况给予了解答,确实是一篇精彩的文章!
(1)服务器端:
修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/)
查找:
AddDefaultCharset ISO-8859-1
改成:
代码:
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off
这种方式关掉了服务器的默认语言的发送,这样仅凭html文件头中设置的语言来决定网页语言。
很多文章都说通过修改为 AddDefaultCharset GB2312 把缺省语言改成GB2312来解决中文乱码,确实GB2312内码的网页可以正常显示了,但这并非万全之策。因为当你的网页内码不是GB2312,就算你在网页用下面的meta指定了正确的语言,如ISO8859-1,也不会解码为ISO8859-1,因为Apache已经先你一步将GB2312指定为网页的语言了,
(2)养成良好的习惯,在每个网页的的最前面加入这行:
代码:
一般的中文版网页编辑工具(例如FrontPage、Dreamweaver等)都会自动加上这行。
(3)、如何解决中文文件名无法访问
代码:
在ie中选择 工具 -> internet选项 -> 高级 -> 取消“总是以UTF-8发送URL”。
UTF-8网页空白,在网页中加上metadata标识后,还需要手动调整编码为 utf-8 才能正常显示
如果使用的是Mozilla、Mozilla Firefox、Sarafi等其他目前流行的浏览器,通常就不会有这样的问题。
在网页的meta中指定用UTF-8:
代码:
在之前,把"Content-Type"放在最前面,便可以解决这样的问题了。
原因:
IE 解析网页编码时是 HTML 内的标识优先的,然后是 HTTP header ;而mozilla 系列的浏览器刚刚好相反。
一般情况在,很多人是把排在最前面,并且在title中就出现了UTF-8中文,这样, IE在解析时,就先遇到UTF-8,不往下解析了,因此必须把如果把meta放在UTF-8出现之前,这样IE才能判断这个网页是以UTF-8编码的。
总之:
无论是 PHP、JSP、ASP 或其他动态网页的脚本语言,如果需要作编码设定,最好放在最前面。
使用php,也可以定义php的默认语言.
php.ini中:
代码:
default_charset = "gb2312"
释掉此行,做了以上修改,一样是为了让浏览器根据网页头中的charset来自动选择语言,这样就可以在同台服务器上提供多种语言的网页服务。
java中文乱码的解决
在基于JAVA的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。
这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题。
1、在网页中输出中文。
JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如:
String str="中文";
str=new String(str.getBytes("GB2312"),"8859_1");
但如果在编译程序时,使用的编码是“GB2312”,且在中文平台上运行此程序,不会出现此问题,一定要注意。
2、从参数中读取中文
这正好与在网页中输出相反如:
str=new String(str.getBytes("8859_1"),"GB2312");
3、操作DB中的中文问题
一个较简单的方法是:在“控制面扳”中,把“区域”设置为“英语(美国)”。如果还会出现乱码,还可进行如下设置:
取中文时:str=new String(str.getBytes("GB2312"));
向DB中输入中文:str=new String(str.getBytes("ISO-8859-1"));
4、在JSP中的中文解决:
在“控制面扳”中,把“区域”设置为“英语(美国)”.
在JSP页面中加入:
如果还不行正常显示,则还要进行下面的转换:
如:name=new String(name.getBytes("ISO-8859-1"),"GBK");
就不会出现中文问题了。
CGI:
找到CGI.pm,找到$self->charset('ISO-8859-1');将它改为$self->charset('GB2312');
补充:
如果使用php,也可以定义php的默认语言.
php.ini中:
;default_charset = "gb2312"
注意这里是注释掉此行,做了以上修改,目的是为让浏览器根据网页头中的charset来自动选择语言,这样就可以在同台服务器上提供多种语言的网页服务。
彻底解决Tomcat 5.0.19中文乱码
一、Include的页面乱码
现象:include进来的页面出现乱码,其它页面正常。
原因:Tomcat在缺省情况下使用ISO-8859-1编码,但是在include时有时Tomcat不能正确根据外层.jsp文件的编码解析include进来的文件,造成include进来的文件中的中文乱码。
解决:这儿可以有很多解决办法,但是对于我们的中文环境,从根本上的解决办法是将Tomcat 5.0.19的核心缺省编码从ISO-8859-1修改为GBK 。
二、提交的数据乱码
现象:通过表单提交的数据出现乱码。
原因:原因未明。可能是Tomcat在接收到请求后,并没有能够根据request中的信息提前正确的编码方式。
解决:可以添加一个设置字符集的Filter。
代码:
package filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
配置web.xml
代码:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
java Servlet 中文乱码问题
代码:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class GetFormData extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
String paramValues;
paramValues=request.getParameter("UserName";
response.setContentType("text/html;charset=gb2312";
PrintWriter out=response.getWriter();
out.println("";
out.println("以下是收到的数据
";
out.println("UserName="+paramValues);
out.println("
接收结束";
out.println("";
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
doGet(request,response);
}
}
只需要把
代码:
paramValues=request.getParameterValues("UserName"改成下面的就可以了
paramValues=request.getParameter("UserName";
代码:
当然这句是必须的 response.setContentType("text/html;charset=gb2312"
在jsdk2.1 tomcat及Domino5.8上的Servlet引擎运行通过了
Weblogic Server中如何解决中文显示乱码问题
《世界计算机》IT.ICXO.COM ( 日期:2004-09-29 16:07)
--------------------------------------------------------------------------------
由于操作系统、浏览器、数据库、JVM采用的字符集都不一样,基于Weblogic Server开发的应用经常出现中文显示乱码问题,其实在Weblogic Server上运行的WEB应用有很多与字符集有关的设置,下面做一个总结,为了正确处理中文,最好把这些设置都设上。
1. 在JSP文件头加入
代码:
<%@ page contentType=text/html; charset=GBK %>
指定该JSP采用的字符集。
2.在Weblogic.xml文件的中加入:
引用:
encoding
GBK
指定JSP文件中采用的字符集,在JSP文件中的<%@ page contentType=text/html; charset=GBK %>会覆盖该设置
3.在Weblogic.xml文件的中加入
代码:
compilerSupportsEncoding
true
如果为TRUE,指定在编译JSP文件时,采用在JSP文件中定义的
<%@ page contentType=text/html; charset=GBK %>或中定义的encoding参数中定义的字符集进行编码,如果为FALSE,则采用JVM中默认指定的字符集进行编码。
4. Weblogic Server需要把HTTP request(GET 和POST)中的数据从它的原始编码转化为Unicode,以便Java servlet API进行处理,为了做这种转换,Weblogic Server需要知道HPPT request中的数据的编码方式。这可以通过在Weblogic.xml的中设置.
代码:
〈INPUT-charset>
/
GBK
5.从ORACLE数据库中检索出来的中文显示不正确时,在这种情况下,如果数据库使用的是中文字符集,并使用的是Type 2 JDBC Driver时,可加入Weblogic.codeset=GBK的属性来解决这个问题。代码如下:
代码:
java.util.Properties props = new java.util.Properties();
props.put(Weblogic.codeset, GBK);
props.put(user, scott);
props.put(password, tiger);
String connectUrl = jdbc:Weblogic:oracle;
Driver myDriver = (Driver)
Class.forName(Weblogic.jdbc.oci.Driver).newInstance();
Connection conn =
myDriver.connect(connectUrl, props);
6. 如果是采用WTC调用Tuxedo中的服务,在JSP页面中无法正确显示中文,必须使安装Tuxedo的服务器上的NLS_LANG环境变量与数据库中的字符集的设置一样。如后台Oracle数据库中的字符集设置为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK,那么Tuxedo应用服务器上的NLS_LANG环境变量应设置为:
代码:
export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
posted @
2005-05-13 11:22 子玉 阅读(1849) |
评论 (0) |
编辑 收藏
在Windows下建立Java基本环境
现在Java语言越来越流行,随便看一下招聘广告就会发现,会Java几乎已经是招聘程序员的基本要求了。很多朋友都问我“学习Java难不难?”我的回答是:不难。但是很多朋友却感觉学习Java比学习VB、Delphi要困难,这个我感觉就是仁者见仁,智者见智的问题,这个话题要是争论起来可能就是一个无休止的争论了,我认为可能是初学者有一些简单的问题没有搞清楚,所以造成了学习的困难,我希望通过我的小文能够帮助一些正在入门的朋友。
首先,如何得到java环境?
http://java.sun.com/j2ee/1.4/download.html#sdk可以下载最新的java JDK。Sun公司对于只是为了学习用的java采取的是免费的制度,有了这个东东,我们完全没有必要去使用昂贵的JBuilder。
二、什么是JDK?
JDK是Java develop kit的缩写,它是早期Java的开发包名称,一直延用至今!在1998年jdk发表1.2版的时候,Sun公司使用了新名称Java2 platform来称呼Java译成中文就是“Java平台”,修改后的jdk称为J2sdk即Java2(platform)software Develping kit,并分为标准版 (Standard Edition)又称j2se,企业版 (Enterprise Edition)又称j2ee,微型版(Micor Edition)又称j2me.它们有不同的用途,不过最基本的开发包还是j2se。
三、都有哪些版本?
Java诞生以将近有十个年头,不知道你只不知道,它每发布一个版本都有其自己特有的名字,并且有一定的规律,是不是很有趣呢?
已发行的版本:
版本号 名称 中文名 发布日期
JDK 1.1.4 Sparkler 宝石 1997-09-12
JDK 1.1.5 Pumpkin 南瓜 1997-12-13
JDK 1.1.6 Abigail 阿比盖尔--女子名 1998-04-24
JDK 1.1.7 Brutus 布鲁图--古罗马政治家和将军 1998-09-28
JDK 1.1.8 Chelsea 切尔西--城市名 1999-04-08
J2SE 1.2 Playground 运动场 1998-12-04
J2SE 1.2.1 none 无 1999-03-30
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08
J2SE 1.3 Kestrel 美洲红隼 2000-05-08
J2SE 1.3.1 Ladybird 瓢虫 2001-05-17
J2SE 1.4.0 Merlin 灰背隼 2002-02-13
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16
J2SE 1.4.2 Mantis 螳螂 2003-06-26
将来发行的版本:
J2SE 5.0 (1.5.0) Tiger 老虎 已发布了Beta版本
J2SE 5.1 (1.5.1) Dragonfly 蜻蜓 未发布
J2SE 6.0 (1.6.0) Mustang 野马 未发布
从JDK1.2.2开始,主要版本(如1.3,1.4,5.0)都是以鸟类或哺乳动物来命名的.而它们的bug修正版本(如1.2.2,1.3.1,1.4.2)都是以昆虫命名的。
四、安装与环境设置
从sun下载的jdk是一个可执行文件,直接执行即可。在控制面板里面还会出现一个java plug-in ,这个是为了设置java环境的,一般不需要特殊设置,如果你的应用程序对内存有特殊要求可以在高级-〉Java Runtime参数里面进行设置。例如:java -Xms256m -Xmx200m application 。
下面设置path路径,在Win98下,autoexce.bat中加入path=%path%;c:\j2sdk1.4.2_04\bin ;Win2000(XP)下则控制面板->系统->高级->环境变量->系统变量,双击Path,在后面加上c:\j2sdk1.4.2_04\bin。
设置lib路径,在Win98下,autoexce.bat中加入CLASSPATH=.;C:\j2sdk1.4.2_04\lib ; Win2000(XP)下则控制面板->系统->高级->环境变量->系统变量,点击窗下面的“新建”,变量名填入“CLASSPATH”,变量值填入“.;C:\j2sdk1.4.2_04\lib”。
通过上面的设置,我们就有了在Windows下的java基础环境了。我这次介绍的只是在Windows下面的设置,Linux下面的设置也是大同小异,有兴趣的朋友可以去读一下这方面的文章。
posted @
2005-05-13 11:09 子玉 阅读(470) |
评论 (0) |
编辑 收藏