在导出Excel时,纯数字字符串会被当成数字处理,如果数字开头是0,将会被无情的去掉,例如某个字段为 0001,那么导出后盖列值就是1,下面提供几种解决办法,让其不去掉数字前面的0.
1.比较通用的办法是查询数据的时候,在数字前面加单引号,据说这样可以强制转换为文本,例如:
sql server可以这样写:SELECT EXNUM FROM ZDBASE --> SELECT ('' + EXNUM) AS EXNUM FROM ZDBASE
Oracle这样写:SELECT EXNUM FROM ZDBASE --> SELECT ('' || EXNUM) AS EXNUM FROM ZDBASE
我测试时虽然转字符串了,但导出时前面的0仍然被去掉了,如果加两个单引号,导出时数据前面会显示一个单引号,方法感觉行不通
2.查出数据后修改数据的值
例如,查出数据后的DataTable dt,列EXNUM,我们循环每一行的这一列,给这一列值加单引号改变其值,这样导出时可以强制显示完整内容
foreach (DataRow dr in dt.Rows)
{
dr["EMP_NO"] = string.Format("<font color='#ffffff'>{0}</font>{1}", "'", dr["EMP_NO"].ToString());
}
3.网上还有一种方法是用格式,把有问题列的值转换一下格式:
mso-number-format:"0" NO Decimals
mso-number-format:"0/.000" 3 Decimals
mso-number-format:"/#/,/#/#0/.000" Comma with 3 dec
mso-number-format:"mm//dd//yy" Date7
mso-number-format:"mmmm/ d/,/ yyyy" Date9
mso-number-format:"m//d//yy/ h/:mm/ AM//PM" D -T AMPM
mso-number-format:"Short Date" 01/03/1998
mso-number-format:"Medium Date" 01-mar-98
mso-number-format:"d/-mmm/-yyyy" 01-mar-1998
mso-number-format:"Short Time" 5:16
mso-number-format:"Medium Time" 5:16 am
mso-number-format:"Long Time" 5:16:21:00
mso-number-format:"Percent" Percent - two decimals
mso-number-format:"0%" Percent - no decimals
mso-number-format:"0/.E+00" Scientific Notation
mso-number-format:"/@" Text
mso-number-format:"/#/ ???//???" Fractions - up to 3 digits (312/943)
mso-number-format:"/0022£/0022/#/,/#/#0/.00" £12.76
mso-number-format:"/#/,/#/#0/.00_ /;/[Red/]/-/#/,/#/#0/.00/ "
2 decimals, negative numbers in red and signed
(1.56 -1.56)
用法举例:
当我们用<%@page contentType="application/vnd.ms-excel; charset=UTF-8"%>的方法导出jsp文件为excel时,如果导出的数据中有数字以0开头,则该0会被省略,为了保留这个处于首位的0,可以在表格的style中加入:
style='mso-number-format:"/@";'
这样的话,导出的表格中首位为0的数字就会将0保留啦!
.Net也一样,设置样式就可以了:
style='mso-number-format:general;mso-number-format:"/@"'