zoukankan
html css js c++ java
c#导入导出EXCEL
导入导出EXCEL
#region
导入导出EXCEL
/**/
///
<summary>
///
将datatable中的数据导出到指定的excel文件中
///
</summary>
///
<param name="page">
web页面对象
</param>
///
<param name="tab">
包含被导出数据的datatable对象
</param>
///
<param name="filename">
excel文件的名称
</param>
public
static
void
exportExcel(System.Web.UI.Page page, DataTable tab,
string
filename)
{
System.Web.HttpResponse httpresponse
=
page.Response;
System.Web.UI.WebControls.DataGrid datagrid
=
new
System.Web.UI.WebControls.DataGrid();
datagrid.DataSource
=
tab.DefaultView;
datagrid.AllowPaging
=
false
;
datagrid.HeaderStyle.BackColor
=
System.Drawing.Color.LightGray;
datagrid.HeaderStyle.HorizontalAlign
=
HorizontalAlign.Center;
datagrid.HeaderStyle.Font.Bold
=
true
;
datagrid.DataBind();
httpresponse.AppendHeader(
"
content-disposition
"
,
"
attachment;filename=
"
+
HttpUtility.UrlDecode(filename, System.Text.Encoding.UTF8));
//
filename="*.xls";
httpresponse.ContentEncoding
=
System.Text.Encoding.GetEncoding(
"
gb2312
"
);
httpresponse.ContentType
=
"
application/ms-excel
"
;
System.IO.StringWriter tw
=
new
StringWriter();
System.Web.UI.HtmlTextWriter hw
=
new
System.Web.UI.HtmlTextWriter(tw);
datagrid.RenderControl(hw);
string
filepath
=
page.Server.MapPath(
"
..
"
)
+
"
\\ExcelFolder\\
"
+
filename;
System.IO.StreamWriter sw
=
System.IO.File.CreateText(filepath);
sw.Write(tw.ToString());
sw.Close();
downfileForExcel(httpresponse, filename, filepath);
httpresponse.End();
}
private
static
bool
downfileForExcel(System.Web.HttpResponse response,
string
filename,
string
fullpath)
{
try
{
response.ContentType
=
"
application/octet-stream
"
;
response.AppendHeader(
"
content-disposition
"
,
"
attachment;filename=
"
+
HttpUtility.UrlDecode(filename, System.Text.Encoding.UTF8)
+
"
;charset=gb2312
"
);
System.IO.FileStream fs
=
System.IO.File.OpenRead(fullpath);
long
flen
=
fs.Length;
int
size
=
102400
;
//
每100k同时下载数据
byte
[] readdata
=
new
byte
[size];
//
指定缓冲区的大小
if
(size
>
flen) size
=
Convert.ToInt32(flen);
long
fpos
=
0
;
bool
isend
=
false
;
while
(
!
isend)
{
if
((fpos
+
size)
>
flen)
{
size
=
Convert.ToInt32(flen
-
fpos);
readdata
=
new
byte
[size];
isend
=
true
;
}
fs.Read(readdata,
0
, size);
//
读入一个压缩块
response.BinaryWrite(readdata);
fpos
+=
size;
}
fs.Close();
System.IO.File.Delete(fullpath);
return
true
;
}
catch
{
return
false
;
}
}
/**/
///
<summary>
///
将指定Excel文件中的数据转换成DataTable对象,供应用程序进一步处理
///
</summary>
///
<param name="filePath"></param>
///
<returns></returns>
public
static
System.Data.DataTable ImportExcel(
string
filePath)
{
System.Data.DataTable rs
=
new
System.Data.DataTable();
bool
canOpen
=
false
;
OleDbConnection conn
=
new
OleDbConnection(
"
Provider=Microsoft.Jet.OLEDB.4.0;
"
+
"
Data Source=
"
+
filePath
+
"
;
"
+
"
Extended Properties=\
"
Excel
8.0
;\
""
);
try
//
尝试数据连接是否可用
{
conn.Open();
conn.Close();
canOpen
=
true
;
}
catch
{ }
if
(canOpen)
{
try
//
如果数据连接可以打开则尝试读入数据
{
OleDbCommand myOleDbCommand
=
new
OleDbCommand(
"
SELECT * FROM [Sheet1$]
"
, conn);
OleDbDataAdapter myData
=
new
OleDbDataAdapter(myOleDbCommand);
myData.Fill(rs);
conn.Close();
}
catch
//
如果数据连接可以打开但是读入数据失败,则从文件中提取出工作表的名称,再读入数据
{
string
sheetName
=
GetSheetName(filePath);
if
(sheetName.Length
>
0
)
{
OleDbCommand myOleDbCommand
=
new
OleDbCommand(
"
SELECT * FROM [
"
+
sheetName
+
"
$]
"
, conn);
OleDbDataAdapter myData
=
new
OleDbDataAdapter(myOleDbCommand);
myData.Fill(rs);
conn.Close();
}
}
}
else
{
System.IO.StreamReader tmpStream
=
File.OpenText(filePath);
string
tmpStr
=
tmpStream.ReadToEnd();
tmpStream.Close();
rs
=
GetDataTableFromString(tmpStr);
tmpStr
=
""
;
}
return
rs;
}
/**/
///
<summary>
///
将指定Html字符串的数据转换成DataTable对象 --根据“
<tr><td>
”等特殊字符进行处理
///
</summary>
///
<param name="tmpHtml">
Html字符串
</param>
///
<returns></returns>
private
static
DataTable GetDataTableFromString(
string
tmpHtml)
{
string
tmpStr
=
tmpHtml;
DataTable TB
=
new
DataTable();
//
先处理一下这个字符串,删除第一个<tr>之前合最后一个</tr>之后的部分
int
index
=
tmpStr.IndexOf(
"
<tr
"
);
if
(index
>
-
1
)
tmpStr
=
tmpStr.Substring(index);
else
return
TB;
index
=
tmpStr.LastIndexOf(
"
</tr>
"
);
if
(index
>
-
1
)
tmpStr
=
tmpStr.Substring(
0
, index
+
5
);
else
return
TB;
bool
existsSparator
=
false
;
char
Separator
=
Convert.ToChar(
"
^
"
);
//
如果原字符串中包含分隔符“^”则先把它替换掉
if
(tmpStr.IndexOf(Separator.ToString())
>
-
1
)
{
existsSparator
=
true
;
tmpStr
=
tmpStr.Replace(
"
^
"
,
"
^$&^
"
);
}
//
先根据“</tr>”分拆
string
[] tmpRow
=
tmpStr.Replace(
"
</tr>
"
,
"
^
"
).Split(Separator);
for
(
int
i
=
0
; i
<
tmpRow.Length
-
1
; i
++
)
{
DataRow newRow
=
TB.NewRow();
string
tmpStrI
=
tmpRow[i];
if
(tmpStrI.IndexOf(
"
<tr
"
)
>
-
1
)
{
tmpStrI
=
tmpStrI.Substring(tmpStrI.IndexOf(
"
<tr
"
));
if
(tmpStrI.IndexOf(
"
display:none
"
)
<
0
||
tmpStrI.IndexOf(
"
display:none
"
)
>
tmpStrI.IndexOf(
"
>
"
))
{
tmpStrI
=
tmpStrI.Replace(
"
</td>
"
,
"
^
"
);
string
[] tmpField
=
tmpStrI.Split(Separator);
for
(
int
j
=
0
; j
<
tmpField.Length
-
1
; j
++
)
{
tmpField[j]
=
RemoveString(tmpField[j],
"
<font>
"
);
index
=
tmpField[j].LastIndexOf(
"
>
"
)
+
1
;
if
(index
>
0
)
{
string
field
=
tmpField[j].Substring(index, tmpField[j].Length
-
index);
if
(existsSparator) field
=
field.Replace(
"
^$&^
"
,
"
^
"
);
if
(i
==
0
)
{
string
tmpFieldName
=
field;
int
sn
=
1
;
while
(TB.Columns.Contains(tmpFieldName))
{
tmpFieldName
=
field
+
sn.ToString();
sn
+=
1
;
}
TB.Columns.Add(tmpFieldName);
}
else
{
newRow[j]
=
field;
}
}
//
end of if(index>0)
}
if
(i
>
0
)
TB.Rows.Add(newRow);
}
}
}
TB.AcceptChanges();
return
TB;
}
/**/
///
<summary>
///
从指定Html字符串中剔除指定的对象
///
</summary>
///
<param name="tmpHtml">
Html字符串
</param>
///
<param name="remove">
需要剔除的对象--例如输入"
<font>
"则剔除"
<font ???????>
"和"
</font>
>"
</param>
///
<returns></returns>
public
static
string
RemoveString(
string
tmpHtml,
string
remove)
{
tmpHtml
=
tmpHtml.Replace(remove.Replace(
"
<
"
,
"
</
"
),
""
);
tmpHtml
=
RemoveStringHead(tmpHtml, remove);
return
tmpHtml;
}
/**/
///
<summary>
///
只供方法RemoveString()使用
///
</summary>
///
<returns></returns>
private
static
string
RemoveStringHead(
string
tmpHtml,
string
remove)
{
//
为了方便注释,假设输入参数remove="<font>"
if
(remove.Length
<
1
)
return
tmpHtml;
//
参数remove为空:不处理返回
if
((remove.Substring(
0
,
1
)
!=
"
<
"
||
remove.Substring(remove.Length
-
1
)
!=
"
>
"
))
return
tmpHtml;
//
参数remove不是<?????>:不处理返回
int
IndexS
=
tmpHtml.IndexOf(remove.Replace(
"
>
"
,
""
));
//
查找“<font”的位置
int
IndexE
=
-
1
;
if
(IndexS
>
-
1
)
{
string
tmpRight
=
tmpHtml.Substring(IndexS, tmpHtml.Length
-
IndexS);
IndexE
=
tmpRight.IndexOf(
"
>
"
);
if
(IndexE
>
-
1
)
tmpHtml
=
tmpHtml.Substring(
0
, IndexS)
+
tmpHtml.Substring(IndexS
+
IndexE
+
1
);
if
(tmpHtml.IndexOf(remove.Replace(
"
>
"
,
""
))
>
-
1
)
tmpHtml
=
RemoveStringHead(tmpHtml, remove);
}
return
tmpHtml;
}
/**/
///
<summary>
///
将指定Excel文件中读取第一张工作表的名称
///
</summary>
///
<param name="filePath"></param>
///
<returns></returns>
private
static
string
GetSheetName(
string
filePath)
{
string
sheetName
=
""
;
System.IO.FileStream tmpStream
=
File.OpenRead(filePath);
byte
[] fileByte
=
new
byte
[tmpStream.Length];
tmpStream.Read(fileByte,
0
, fileByte.Length);
tmpStream.Close();
byte
[] tmpByte
=
new
byte
[]
{Convert.ToByte(
11
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),
Convert.ToByte(
11
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),Convert.ToByte(
0
),
Convert.ToByte(
30
),Convert.ToByte(
16
),Convert.ToByte(
0
),Convert.ToByte(
0
)}
;
int
index
=
GetSheetIndex(fileByte, tmpByte);
if
(index
>
-
1
)
{
index
+=
16
+
12
;
System.Collections.ArrayList sheetNameList
=
new
System.Collections.ArrayList();
for
(
int
i
=
index; i
<
fileByte.Length
-
1
; i
++
)
{
byte
temp
=
fileByte[i];
if
(temp
!=
Convert.ToByte(
0
))
sheetNameList.Add(temp);
else
break
;
}
byte
[] sheetNameByte
=
new
byte
[sheetNameList.Count];
for
(
int
i
=
0
; i
<
sheetNameList.Count; i
++
)
sheetNameByte[i]
=
Convert.ToByte(sheetNameList[i]);
sheetName
=
System.Text.Encoding.Default.GetString(sheetNameByte);
}
return
sheetName;
}
/**/
///
<summary>
///
只供方法GetSheetName()使用
///
</summary>
///
<returns></returns>
private
static
int
GetSheetIndex(
byte
[] FindTarget,
byte
[] FindItem)
{
int
index
=
-
1
;
int
FindItemLength
=
FindItem.Length;
if
(FindItemLength
<
1
)
return
-
1
;
int
FindTargetLength
=
FindTarget.Length;
if
((FindTargetLength
-
1
)
<
FindItemLength)
return
-
1
;
for
(
int
i
=
FindTargetLength
-
FindItemLength
-
1
; i
>
-
1
; i
--
)
{
System.Collections.ArrayList tmpList
=
new
System.Collections.ArrayList();
int
find
=
0
;
for
(
int
j
=
0
; j
<
FindItemLength; j
++
)
{
if
(FindTarget[i
+
j]
==
FindItem[j]) find
+=
1
;
}
if
(find
==
FindItemLength)
{
index
=
i;
break
;
}
}
return
index;
}
#endregion
查看全文
相关阅读:
.Net转Java自学之路—SpringMVC框架篇九(拦截器)
.Net转Java自学之路—SpringMVC框架篇八(RESTful支持)
移动端高清适配、布局开发解决方案
Webpack+Gulp+React+ES6开发
gulp使用gulp-file-include将header/footer引入页面
git在window与linux的换行符问题
文件(图片)上传组件
ie8、9跨域上传文件(图片)
移动端rem布局背景图片使用以及sprite雪碧图
iOS/Android 浏览器(h5)及微信中唤起本地APP
原文地址:https://www.cnblogs.com/daxia/p/1030779.html
最新文章
从零自学Hadoop(19):HBase介绍及安装
Hadoop技巧(03):HostName命名带来的问题
Hadoop技巧(02):时间同步
确定一个字符串是否包含在另一个字符串中
分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》
MongoDB服务无法启动,windows提示发生服务特定错误:100
web前端技术框架选型参考
nw.js桌面程序自动更新(node.js表白记)
如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
angularjs使用directive实现分页组件
热门文章
angularjs自定义日期过滤器,如:周日(前天 21:24)
使用nw.js将html项目打包为桌面程序
反射—简单实例
tomcat启动报错:org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
Linux系统安装配置tomcat
Linex系统配置Java环境
spring boot配置文件application.yml出现的异常信息:(java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml')
连接mysql时出现的异常信息:(com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';allowMultiQueries=true')
spring boot使用过程中Mybaties出现的异常信息:(java.lang.RuntimeException: Cannot instantiate object of type tk.mybatis.mapper.generator.MapperPlugin)
Vue-邮箱正则验证
Copyright © 2011-2022 走看看