zoukankan
html css js c++ java
DataTable转换为Excel文件
/**/
///
<summary>
///
将DataTable中的数据导出到指定的Excel文件中
///
</summary>
///
<param name=page>
Web页面对象
</param>
///
<param name=tab>
包含被导出数据的DataTable对象
</param>
///
<param name=FileName>
Excel文件的名称
</param>
public
static
void
Export(System.Web.UI.Page page,System.Data.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.Green;
dataGrid.HeaderStyle.HorizontalAlign
=
HorizontalAlign.Center;
dataGrid.HeaderStyle.Font.Bold
=
true
;
dataGrid.DataBind();
httpResponse.AppendHeader(Content
-
Disposition,attachment;filename
=+
HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8));
//
filename=*.xls;
httpResponse.ContentEncoding
=
System.Text.Encoding.GetEncoding(GB2312);
httpResponse.ContentType
=
application
/
ms
-
excel;
System.IO.StringWriter tw
=
new
System.IO.StringWriter() ;
System.Web.UI.HtmlTextWriter hw
=
new
System.Web.UI.HtmlTextWriter (tw);
dataGrid.RenderControl(hw);
string
filePath
=
page.Server.MapPath(..)
+
\\\\Files\\\\
+
FileName;
System.IO.StreamWriter sw
=
System.IO.File.CreateText(filePath);
sw.Write(tw.ToString());
sw.Close();
DownFile(httpResponse,FileName,filePath);
httpResponse.End();
}
private
static
bool
DownFile(System.Web.HttpResponse Response,
string
fileName,
string
fullPath)
{
try
{
Response.ContentType
=
application
/
octet
-
stream;
Response.AppendHeader(Content
-
Disposition,attachment;filename
=
+
HttpUtility.UrlEncode(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 Import(
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;
}
查看全文
相关阅读:
CVE-2020-1938 Apache-Tomcat-Ajp 文件包含漏洞复现
关于CVE-2020-0796
如何伪造邮箱
如何判断主机是否存在某系统漏洞
DC3
小记如何绕过受限的shell
DC1
1111. 有效括号的嵌套深度 看题两小时,做题10分钟系列,这是在考语文吧
LeetCode 912. 排序数组
LeetCode--算法,简单级别1
原文地址:https://www.cnblogs.com/adam/p/952973.html
最新文章
ubuntu + vscode C++ 新建项目、开发、编译、调试
linux jsoncpp源码编译
修改DNS
Linux libcurl源码编译以及安装过程
webrtc codec
leecode问题两数反转
leecode问题之两数之和
EFcore与动态模型
asp.net core mvc剖析:路由
asp.net core mvc实现伪静态功能
热门文章
asp.net core mvc剖析:处理管道构建
asp.net core mvc剖析:KestrelServer
asp.net core mvc剖析:启动流程
asp.net core mvc权限控制:分配权限
asp.net core mvc权限控制:在视图中控制操作权限
asp.net core mvc权限控制:权限控制介绍
ASP.NET Core MVC 中设置全局异常处理方式
简单的网络数据分析溯源(上传WebShell的IP地址)
记一次UA构造的过程
BeesCMS 4.0 SQL注入漏洞分析
Copyright © 2011-2022 走看看