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 子玉 閱讀(2213) |
評論 (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 子玉 閱讀(839) |
評論 (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命令得到的?,F在假設有個
用戶名為foxy,需要創建自己的一個crontab文件。首先可以使用任何文本編輯器建立一個新文件,然后向其中寫入需要運行的命令和要定期執行的時
間。
然后存盤退出。假設該文件為/tmp/test.cron。再后就是使用crontab命令來安裝這個文件,使之成為該用戶的crontab文件。鍵入:
crontab test.cron 這樣一個crontab
文件就建立好了??梢赞D到/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 子玉 閱讀(425) |
評論 (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 。
二、提交的數據亂碼
現象:通過表單提交的數據出現亂碼。
原因:原因未明??赡苁荰omcat在接收到請求后,并沒有能夠根據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>
?。糵ilter-name>Set Character Encoding</filter-name>
?。糵ilter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
?。糵ilter-name>Set Character Encoding</filter-name>
?。紆rl-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 子玉 閱讀(1851) |
評論 (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 子玉 閱讀(474) |
評論 (0) |
編輯 收藏