public HttpResponseMessage Get(string obj, string pars, string mappingRule)
{
try
{
string cmdtext = "Get" + obj;
DataTable dt = exeSP(cmdtext, pars);
mappingExcelCol(dt, mappingRule);
//return WriteExcel(dt, "");
// return DataTable2Excel(dt);
//return StreamExport(dt, "doooo.xls");
String dir = ConfigurationManager.AppSettings["ImportFileFolder"];
String tmpExcel = dir + "\\" + Guid.NewGuid().ToString() + ".xls";
return TableToExcelFile(dt, tmpExcel, HttpContext.Current.Server.MapPath("~\\Files\\Blank.xls"));
}
catch (IOException)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
//dt为数据源(数据表)
//ExcelFileName 为要导出的Excle文件
//ModelFile为模板文件,该文件与数据源中的表一致。否则数据会导出失败。
//ModelFile文件里,需要有一张 与 dt.TableName 一致的表,而且字段也要一致。
//注明:如果不用ModelFile的话,可以用一个空白Excel文件,不过,要去掉下面创建表的注释,让OleDb自己创建一个空白表。
public HttpResponseMessage TableToExcelFile(DataTable dt, string ExcelFileName, string ModelFile)
{
dt.TableName = "Sheet1";
File.Copy(ModelFile, ExcelFileName); //复制一个空文件,提供写入数据用
if (File.Exists(ExcelFileName) == false)
{
throw new Exception( "系统创建临时文件失败,请与系统管理员联系!");
}
if (dt == null)
{
throw new Exception( "DataTable不能为空");
}
int rows = dt.Rows.Count;
int cols = dt.Columns.Count;
StringBuilder sb;
string connString;
if (rows == 0)
{
throw new Exception( "没有数据");
}
sb = new StringBuilder();
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";
//生成创建表的脚本
//sb.AppendLine("DROP TABLE " + dt.TableName + "\r\n");
sb.Append("CREATE TABLE ");
sb.Append(dt.TableName + " ( ");
for(int i=0;i<cols;i++)
{
if(i < cols - 1)
sb.Append(string.Format("[{0}] varchar,",dt.Columns[i].ColumnName));
else
sb.Append(string.Format("[{0}] varchar)",dt.Columns[i].ColumnName));
}
//return sb.ToString();
OleDbConnection objConn = new OleDbConnection(connString);
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn;
//del
try
{
objConn.Open();
objCmd.CommandText = "DROP TABLE " + dt.TableName;
objCmd.ExecuteNonQuery();
objCmd.CommandText = sb.ToString();
objCmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw new Exception( "在Excel中创建表失败,错误信息:" + e.Message);
}
sb.Remove(0, sb.Length);
sb.Append("INSERT INTO ");
sb.Append(dt.TableName + " ( ");
for (int i = 0; i < cols; i++)
{
if (i < cols - 1)
sb.Append(dt.Columns[i].ColumnName + ",");
else
sb.Append(dt.Columns[i].ColumnName + ") values (");
}
for (int i = 0; i < cols; i++)
{
if (i < cols - 1)
sb.Append("
@" + dt.Columns[i].ColumnName + ",");
else
sb.Append("
@" + dt.Columns[i].ColumnName + ")");
}
//建立插入动作的Command
objCmd.CommandText = sb.ToString();
OleDbParameterCollection param = objCmd.Parameters;
for (int i = 0; i < cols; i++)
{
param.Add(new OleDbParameter("
@" + dt.Columns[i].ColumnName, OleDbType.VarChar));
}
//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < param.Count; i++)
{
param[i].Value = row[i];
}
objCmd.ExecuteNonQuery();
}
// return "数据已成功导入Excel";
objConn.Close();
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(File.OpenRead(ExcelFileName));
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.xls"
};
return response;
}
public HttpResponseMessage WriteExcel(DataTable dt, string fileName) {
dt.TableName = "Excel";
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
MemoryStream ms = new MemoryStream();
dt.WriteXml(ms, XmlWriteMode.WriteSchema);
response.Content = new StreamContent(ms);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.xls"
};
return response;
}
///
/// DataTable通过流导出Excel
///
/// <param name="ds">数据源DataSet
/// <param name="columns">DataTable中列对应的列名(可以是中文),若为null则取DataTable中的字段名
/// <param name="fileName">保存文件名(例如:a.xls)
///
public HttpResponseMessage StreamExport(DataTable dt, string fileName)
{
if (dt.Rows.Count > 65535) //总行数大于Excel的行数
{
throw new Exception("预导出的数据总行数大于excel的行数");
}
//if (string.IsNullOrEmpty(fileName)) return false;
StringBuilder content = new StringBuilder();
StringBuilder strtitle = new StringBuilder();
content.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>");
content.Append("<meta http-equiv='Content-Type' content=\"text/html; charset=gb2312\">");
//注意:[if gte mso 9]到[endif]之间的代码,用于显示Excel的网格线,若不想显示Excel的网格线,可以去掉此代码
content.Append("");
content.Append("");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append(" Sheet1");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append(" ");
content.Append("");
content.Append("");
content.Append("");
content.Append("");
for (int j = 0; j < dt.Columns.Count; j++)
{
content.Append("| " + dt.Columns[j].ColumnName + " | ");
}
content.Append("
\n");
for (int j = 0; j < dt.Rows.Count; j++)
{
content.Append("");
for (int k = 0; k < dt.Columns.Count; k++)
{
object obj = dt.Rows[j][k];
Type type = obj.GetType();
if (type.Name == "Int32" || type.Name == "Single" || type.Name == "Double" || type.Name == "Decimal")
{
double d = obj == DBNull.Value ? 0.0d : Convert.ToDouble(obj);
if (type.Name == "Int32" || (d - Math.Truncate(d) == 0))
content.AppendFormat("| {0} | ", obj);
else
content.AppendFormat("{0} | ", obj);
}
else
content.AppendFormat("{0} | ", obj);
}
content.Append("
\n");
}
content.Append("
");
content.Replace(" ", "");
byte[] fileContents = Encoding.Default.GetBytes(content.ToString());
var fileStream = new MemoryStream(fileContents);
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.xls"
};
return response;
//pages.Response.Clear();
//pages.Response.Buffer = true;
//pages.Response.ContentType = "application/ms-excel"; //"application/ms-excel";
//pages.Response.Charset = "UTF-8";
//pages.Response.ContentEncoding = System.Text.Encoding.UTF7;
//fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
//pages.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
//pages.Response.Write(content.ToString());
////pages.Response.End(); //注意,若使用此代码结束响应可能会出现“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。”的异常。
//HttpContext.Current.ApplicationInstance.CompleteRequest(); //用此行代码代替上一行代码,则不会出现上面所说的异常。
//return true;
}
///
/// 这种方式导出来的Excel,会提示格式不匹配,但是能正常查看
///
///
///
private HttpResponseMessage DataTable2Excel(DataTable dt) {
var sbHtml = new StringBuilder();
sbHtml.Append("");
sbHtml.Append("");
foreach (DataColumn item in dt.Columns)
{
sbHtml.AppendFormat("| {0} | ", item.ColumnName);
}
sbHtml.Append("
");
foreach (DataRow dr in dt.Rows)
{
sbHtml.Append("");
foreach (DataColumn dc in dt.Columns)
{
sbHtml.AppendFormat("| {0} | ", dr[dc]);
}
sbHtml.Append("
");
}
sbHtml.Append("
");
byte[] fileContents = Encoding.Default.GetBytes(sbHtml.ToString());
var fileStream = new MemoryStream(fileContents);
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.xls"
};
return response;
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
发表回复
要发表评论,您必须先登录。