台拖一个Gridview,在拖一个导出excel的按钮,给这个按钮添加事件
后台代码:
using BLL;
using Model;
namespace Web
{
public partial class ExcelOperate : System.Web.UI.Page
{
private StudentBLL bll=new StudentBLL();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind();
}
}
//绑定数据
private void Bind()
{
GridView1.DataSource=bll.GetAllStu(null);
GridView1.DataBind();
}
#region 导出到excel
//导出excel
protected void btnExcelout_Click(object sender, EventArgs e)
{
string style=@"<style> .text { mso-number-format:\@; } </script> "; //设置格式
Response.ClearContent();
Response.ContentEncoding=Encoding.GetEncoding("gbk");
Response.AddHeader("content-disposition", "attachment;filename=ouput.xls");
Response.ContentType="application/excel";
StringWriter sw=new StringWriter();
HtmlTextWriter htw=new HtmlTextWriter(sw);
GridView1.RenderControl(htw);
Response.Write(style);//注意
Response.Write(sw.ToString());
Response.End();
}
//注意:必须覆盖此方法
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}
//解决数字字符串显示不完全
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
// e.Row.Cells[3].Attributes.Add("class", "text");//在数据绑定中设置格式
//哪一列需要显示文本的,加上下面这句话即可
e.Row.Cells[3].Attributes.Add("style", "vnd.ms-excel.numberformat:@");
}
#endregion
}
}页面效果:
导入Excel并保存到数据库:
前台需要拖一个FileUpload上传控件,一个导入excel按钮,给其添加事件:
//导入excel数据
protected void btnExcelIn_Click(object sender, EventArgs e)
{
string filepath=string.Empty;
string getErrormg=string.Empty;
DataTable dt=new DataTable();
if (!fuFile.HasFile)
{
Response.Write("<script>alert('请选择你要导入的Excel文件');</script>");
return;
}
//获取文件的后缀名
string fileExt=System.IO.Path.GetExtension(fuFile.FileName);
if (fileExt !=".xls")
{
Response.Write("<script>alert('文件类型错误!');</script>");
return;
}
//获取绝对路径
filepath=fuFile.PostedFile.FileName;
string conn="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";Data Source=" + filepath;
OleDbConnection excelCon=new OleDbConnection(conn);
//Excel文件里面工作表名 默认为Sheet1,后面需要加上$符号[工作表名称$]切记,不然会报错
OleDbDataAdapter odda=new OleDbDataAdapter("SELECT * FROM [Sheet1$]", excelCon);
try
{
odda.Fill(dt);
}
catch (Exception ex)
{
Response.Write(ex.Message);
Response.Write("<script>alert('" + ex.Message + "!')</script>");
}
finally
{
excelCon.Close();
excelCon.Dispose();
}
//将数据写到数据库里面
try
{
for (int i=0; i < dt.Rows.Count; i++)
{
Studnet stu=new Studnet();
stu.C_id=Convert.ToInt32(dt.Rows[i]["c_id"]);
stu.No=dt.Rows[i]["no"].ToString();
stu.Name=dt.Rows[i]["name"].ToString();
stu.Gender=dt.Rows[i]["gender"].ToString()=="男" ? true : false;
stu.Age=Convert.ToInt32(dt.Rows[i]["age"].ToString());
bll.InsertStu(stu);
}
}
catch (Exception ex)
{
getErrormg=ex.Message;
Response.Write(ex.Message);
}
if (getErrormg=="")
{
Response.Write("<script>alert('导入Excel文件成功!')</script>");
Bind();
}
else { Response.Write("<script>alert('导入Excel文件失败!')</script>"); }
}Excel和导入后的页面效果:
数据库在导入excel数据之前和时候的效果:
这里要注意几个地方,一般导出excel的时候,数字文本会把前面的0都省略掉了,这里需要注意:红色代码片段,导入的时候,也有个***红红红色***标记码块要注意
以下是前台完整代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExcelOperate.aspx.cs" Inherits="Web.ExcelOperate" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"></asp:GridView>
<br />
<asp:Button ID="btnExcelout" runat="server" OnClick="btnExcelout_Click" Text="导出到Excel" />
<br />
<asp:FileUpload ID="fuFile" runat="server" />
<asp:Button ID="btnExcelIn" runat="server" OnClick="btnExcelIn_Click" Text="导入Excel数据" />
</div>
</form>
</body>
</html>以下是后台完整代码:
web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使用 ClosedXML 实现 Excel 数据导出。
如果想实现 Excel 的导出功能,在 Asp.Net Core 中有很多的dll可以做到,其中的一个叫做 ClosedXML,你可以通过可视化界面 NuGet package manager 去安装,也可以使用命令行 NuGet package manager console 执行下面命令。
Install-Package ClosedXML
将数据导成 CSV 文件是非常简单的,毕竟每行数据都是用 , 隔开即可,可以用 NuGet 上的 CsvExport 或者 AWright18.SimpleCSVExporter 去实现,当然你觉得自己很 ,可以亲自操刀实现,下面我准备亲自实现一下,先看下面定义的 Author 类。
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后塞一些数据到 authors 列表中,如下代码所示:
List<Author> authors=new List<Author>
{
new Author { Id=1, FirstName="Joydip", LastName="Kanjilal" },
new Author { Id=2, FirstName="Steve", LastName="Smith" },
new Author { Id=3, FirstName="Anand", LastName="Narayaswamy"}
};
定义一个 DownloadCommaSeperatedFile 方法,用于实现 Action 的 csv 导出功能。
public IActionResult DownloadCommaSeperatedFile()
{
try
{
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.AppendLine("Id,FirstName,LastName");
foreach (var author in authors)
{
stringBuilder.AppendLine($"{author.Id},
{author.FirstName},{author.LastName}");
}
return File(Encoding.UTF8.GetBytes
(stringBuilder.ToString()), "text/csv", "authors.csv");
}
catch
{
return Error();
}
}
Excel 中的 workbook 是由若干个 worksheet 组成,下面的代码可用来生成一个 workbook。
var workbook=new XLWorkbook();
接下来生成一个 worksheet,然后在 worksheet 中填一些数据,代码如下:
IXLWorksheet worksheet=workbook.Worksheets.Add("Authors");
worksheet.Cell(1, 1).Value="Id";
worksheet.Cell(1, 2).Value="FirstName";
worksheet.Cell(1, 3).Value="LastName";
for (int index=1; index <=authors.Count; index++)
{
worksheet.Cell(index + 1, 1).Value=authors[index - 1].Id;
worksheet.Cell(index + 1, 2).Value=authors[index - 1].FirstName;
worksheet.Cell(index + 1, 3).Value=authors[index - 1].LastName;
}
最后,将 workbook 转成 内存流 (memory stream) 再通过 Controller.Action 的 FileContentResult 返回给客户端,代码如下:
using (var stream=new MemoryStream())
{
workbook.SaveAs(stream);
var content=stream.ToArray();
return File(content, contentType, fileName);
}
下面是导出 Excel 所有的业务逻辑代码,这个 Action 实现了 Excel 导出功能。
public IActionResult DownloadExcelDocument()
{
string contentType="application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet";
string fileName="authors.xlsx";
try
{
using (var workbook=new XLWorkbook())
{
IXLWorksheet worksheet= workbook.Worksheets.Add("Authors");
worksheet.Cell(1, 1).Value="Id";
worksheet.Cell(1, 2).Value="FirstName";
worksheet.Cell(1, 3).Value="LastName";
for (int index=1; index <=authors.Count; index++)
{
worksheet.Cell(index + 1, 1).Value= authors[index - 1].Id;
worksheet.Cell(index + 1, 2).Value= authors[index - 1].FirstName;
worksheet.Cell(index + 1, 3).Value= authors[index - 1].LastName;
}
using (var stream=new MemoryStream())
{
workbook.SaveAs(stream);
var content=stream.ToArray();
return File(content, contentType, fileName);
}
}
}
catch(Exception ex)
{
return Error();
}
}
这篇就是 ClosedXML 的所有内容,如果你想对 Excel 中的数据进行更加复杂的操控,可以使用 EPPlus 或者 NPOI,关于 ClosedXML 的更多内容,可参考:https://github.com/ClosedXML/ClosedXML
译文链接:https://www.infoworld.com/article/3538413/how-to-export-data-to-excel-in-aspnet-core-30.html
更多高质量干货:参见我的 GitHub: dotnetfly**
能转换:R图和统计表转成发表级的Word、PPT、Excel、HTML、Latex、矢量图等
R包export可以轻松的将R绘制的图和统计表输出到 Microsoft Office (Word、PowerPoint和Excel)、HTML和Latex中,其质量可以直接用于发表。
export包可以在Windows、Ubuntu和Mac上跨平台运行。不过有些Mac发行版默认情况下没有安装cairo设备,需要自行安装。如果Mac用户已安装XQuartz,这个问题就解决了,它可以从https://www.xquartz.org/免费获得。
install.packages("export")
install.packages("officer")
install.packages("rvg")
install.packages("openxlsx")
install.packages("ggplot2")
install.packages("flextable")
install.packages("xtable")
install.packages("rgl")
install.packages("stargazer")
install.packages("tikzDevice")
install.packages("xml2")
install.packages("broom")
install.packages("devtools")
devtools::install_github("tomwenseleers/export")
该包主要包括以下几种转换
使用帮助信息如下:
graph2bitmap(x=NULL, file="Rplot", fun=NULL, type=c("PNG","JPG", "TIF"),
aspectr=NULL, width=NULL, height=NULL, dpi=300,scaling=100,
font=ifelse(Sys.info()["sysname"]=="Windows", "Arial",
"Helvetica")[[1]], bg="white", cairo=TRUE,
tiffcompression=c("lzw", "rle", "jpeg", "zip", "lzw+p", "zip+p"),
jpegquality=99, ...)
安装完 export包后,先调用该包
library(export)
library(ggplot2)
library(datasets)
x=qplot(Sepal.Length, Petal.Length, data=iris,
color=Species, size=Petal.Width, alpha=I(0.7))
qplot()的意思是快速作图,利用它可以很方便的创建各种复杂的图形,其他系统需要好几行代码才能解决的问题,用qplot只需要一行就能完成。
使用半透明的颜色可以有效减少图形元素重叠的现象,要创建半透明的颜色,可以使用alpha图形属性,其值从0(完全透明)到1(完全不透明)。更多ggplot2绘图见ggplot2高效实用指南 (可视化脚本、工具、套路、配色) (往期教程更有很多生物信息相关的例子)。
鸢尾花(iris)是数据挖掘常用到的一个数据集,包含150个鸢尾花的信息,每50个取自三个鸢尾花种之一(setosa,versicolour或virginica)。每个花的特征用下面的5种属性描述萼片长度(Sepal.Length)、萼片宽度(Sepal.Width)、花瓣长度(Petal.Length)、花瓣宽度(Petal.Width)、类(Species)。
在console里展示数据图 (长宽比自己调节):
# 需运行上面的ggplot2绘图
# Create a file name
# 程序会自动加后缀
filen <- "output_filename" # or
# filen <- paste("YOUR_DIR/ggplot")
# There are 3 ways to use graph2bitmap():
### 1. Pass the plot as an object
graph2png(x=x, file=filen, dpi=400, height=5, aspectr=4)
graph2tif(x=x, file=filen, dpi=400, height=5, aspectr=4)
graph2jpg(x=x, file=filen, dpi=400, height=5, aspectr=4)
### 2. Get the plot from current screen device
# 注意这个x,是运行命令,展示图像
x
graph2png(file=filen, dpi=400, height=5, aspectr=4)
graph2tif(file=filen, dpi=400, height=5, aspectr=4)
graph2jpg(file=filen, dpi=400, height=5, aspectr=4)
### 3. Pass the plot as a functio
plot.fun <- function(){
print(qplot(Sepal.Length, Petal.Length, data=iris,
color=Species, size=Petal.Width, alpha=0.7))
}
graph2png(file=filen, fun=plot.fun, dpi=400, height=5, aspectr=4)
graph2tif(file=filen, fun=plot.fun, dpi=400, height=5, aspectr=4)
graph2jpg(file=filen, fun=plot.fun, dpi=400, height=5, aspectr=4)
转换后的图形:
大部分图的细节修改都是用代码完成的,不需要后续的修饰;但如果某一些修改比较特异,不具有程序的通用性特征,或实现起来比较困难,就可以考虑后期修改。比如用AI文章用图的修改和排版。熟悉PPT的,也可以用PPT,这时R的图导出PPT,就要用到graph2office系列函数了。
graph2ppt: 将当前R图保存到Microsoft Office PowerPoint/LibreOffice Impress演示文稿中。
graph2doc:将当前的R图保存到Microsoft Office Word/LibreOffice Writer文档中。
函数参数展示和解释
graph2office(x=NULL, file="Rplot", fun=NULL, type=c("PPT", "DOC"),
append=FALSE, aspectr=NULL, width=NULL, height=NULL,scaling=100,
paper="auto", orient=ifelse(type[1]=="PPT","landscape", "auto"),
margins=c(top=0.5, right=0.5, bottom=0.5, left=0.5),
center=TRUE, offx=1, offy=1, upscale=FALSE, vector.graphic=TRUE, ...)
# 需运行上面的ggplot2绘图
# Create a file name
filen <- "output_filename" # or
# filen <- paste("YOUR_DIR/ggplot")
# There are 3 ways to use graph2office():
### 1. Pass the plot as an object
# 导出图形对象
graph2ppt(x=x, file=filen)
graph2doc(x=x, file=filen, aspectr=0.5)
### 2. Get the plot from current screen device
# 导出当前预览窗口呈现的图
x
graph2ppt(file=filen, width=9, aspectr=2, append=TRUE)
graph2doc(file=filen, aspectr=1.7, append=TRUE)
### 3. Pass the plot as a function
# 导出自定义函数输出的一系列图
graph2ppt(fun=plot.fun, file=filen, aspectr=0.5, append=TRUE)
graph2doc(fun=plot.fun, file=filen, aspectr=0.5, append=TRUE)
导出到office(ppt和word)中的图形,是可编辑的:
其它导出到ppt的例子(设置长宽比)
graph2ppt(file="ggplot2_plot.pptx", aspectr=1.7)
增加第二张同样的图,9英寸宽和A4长宽比的幻灯片 (append=T,追加)
graph2ppt(file="ggplot2_plot.pptx", width=9, aspectr=sqrt(2), append=TRUE)
添加相同图形的第三张幻灯片,宽度和高度固定
graph2ppt(file="ggplot2_plot.pptx", width=6, height=5, append=TRUE)
禁用矢量化图像导出
graph2ppt(x=x, file=filen, vector.graphic=FALSE, width=9, aspectr=sqrt(2), append=TRUE)
用图填满幻灯片
graph2ppt(x=x, file=filen, margins=0, upscale=TRUE, append=TRUE)
函数参数解释
graph2vector(x=NULL, file="Rplot", fun=NULL, type="SVG",aspectr=NULL,
width=NULL, height=NULL, scaling=100,
font=ifelse(Sys.info()["sysname"]=="Windows",
"Arial","Helvetica")[[1]], bg="white", colormodel="rgb",
cairo=TRUE,fallback_resolution=600, ...)
#需运行上面的ggplot2绘图
# Create a file name
filen <- "output_filename" # or
# filen <- paste("YOUR_DIR/ggplot")
# There are 3 ways to use graph2vector():
### 1. Pass the plot as an object
# 导出图形对象
graph2svg(x=x, file=filen, aspectr=2, font="Times New Roman",
height=5, bg="white")
graph2pdf(x=x, file=filen, aspectr=2, font="Arial",
height=5, bg="transparent")
graph2eps(x=x, file=filen, aspectr=2, font="Arial",
height=5, bg="transparent")
# 导出当前预览窗口呈现的图
### 2. Get the plot from current screen device
x
graph2svg(file=filen, aspectr=2, font="Arial",
height=5, bg="transparent")
graph2pdf(file=filen, aspectr=2, font="Times New Roman",
height=5, bg="white")
graph2eps(file=filen, aspectr=2, font="Times New Roman",
height=5, bg="white")
# 导出自定义函数输出的一系列图
### 3. Pass the plot as a function
graph2svg(file=filen, fun=plot.fun, aspectr=2, font="Arial",
height=5, bg="transparent")
graph2pdf(file=filen, fun=plot.fun, aspectr=2, font="Arial",
height=5, bg="transparent")
graph2eps(file=filen, fun=plot.fun, aspectr=2, font="Arial",
height=5, bg="transparent")
rgl2png: 将当前的rgl 3D图形保存为PNG格式。
rgl2bitmap(file="Rplot", type=c("PNG"))
# Create a file name
filen <- tempfile("rgl") # or
# filen <- paste("YOUR_DIR/rgl")
# Generate a 3D plot using 'rgl'
x=y=seq(-10, 10, length=20)
z=outer(x, y, function(x, y) x^2 + y^2)
rgl::persp3d(x, y, z, col='lightblue')
# Save the plot as a png
rgl2png(file=filen)
# Note that omitting 'file' will save in current directory
生成的3D图形:
将生成的3D图形保存为PNG格式:
table2spreadsheet(x=NULL, file="Rtable", type=c("XLS", "CSV",
"CSV2"), append=FALSE, sheetName="new sheet", digits=2,
digitspvals=2, trim.pval=TRUE, add.rownames=FALSE, ...)
# Create a file name
filen <- "table_aov" # or
# filen <- paste("YOUR_DIR/table_aov")
# Generate ANOVA output
fit=aov(yield ~ block + N * P + K, data=npk) # 'npk' dataset from base 'datasets'
x=summary(fit)
# Save ANOVA table as a CSV
### Option 1: pass output as object
# 输出对象
table2csv(x=x,file=filen, digits=1, digitspvals=3, add.rownames=TRUE)
# 屏幕输出导出到文件
### Option 2: get output from console
summary(fit)
table2csv(file=filen, digits=2, digitspvals=4, add.rownames=TRUE)
# Save ANOVA table as an Excel
# Without formatting of the worksheet
x
table2excel(file=filen, sheetName="aov_noformatting", digits=1, digitspvals=3, add.rownames=TRUE)
# 更多参数
# With formatting of the worksheet
table2excel(x=x,file=filen, sheetName="aov_formated", append=TRUE, add.rownames=TRUE, fontName="Arial", fontSize=14, fontColour=rgb(0.15,0.3,0.75), border=c("top", "bottom"), fgFill=rgb(0.9,0.9,0.9), halign="center", valign="center", textDecoration="italic")
原始数据的表格:
转换格式之后的,在console中的数据:
文件(csv和excel)中表格数据:
table2ppt: 导出统计输出到Microsoft Office PowerPoint/ LibreOffice Impress演示文稿中的表
table2doc: 将统计输出导出到Microsoft Office Word/ LibreOffice Writer文档中的表
table2office(x=NULL, file="Rtable", type=c("PPT", "DOC"),
append=FALSE, digits=2, digitspvals=2, trim.pval=TRUE,
width=NULL, height=NULL, offx=1, offy=1,
font=ifelse(Sys.info()["sysname"]=="Windows", "Arial",
"Helvetica")[[1]], pointsize=12, add.rownames=FALSE)
# Create a file name
filen <- "table_aov"
# filen <- paste("YOUR_DIR/table_aov")
# Generate ANOVA output
fit=aov(yield ~ block + N * P + K, data=npk) # 'npk' dataset from base 'datasets'
# Save ANOVA table as a PPT
### Option 1: pass output as object
x=summary(fit)
table2ppt(x=x,file=filen, digits=1, digitspvals=3, add.rownames=TRUE)
### Option 2: get output from console
summary(fit)
table2ppt(x=x,file=filen, width=5, font="Times New Roman", pointsize=14, digits=4, digitspvals=1, append=TRUE, add.rownames=TRUE) # append table to previous slide
# Save ANOVA table as a DOC file
table2doc(x=x,file=filen, digits=1, digitspvals=3, add.rownames=TRUE)
summary(fit)
table2doc(file=filen, width=3.5, font="Times New Roman", pointsize=14, digits=4, digitspvals=1, append=TRUE, add.rownames=TRUE) # append table at end of document
将表格数据导出到ppt和word中:
table2html: 导出统计输出到HTML表。
table2tex(x=NULL, file="Rtable", type="TEX", digits=2,
digitspvals=2, trim.pval=TRUE, summary=FALSE, standAlone=TRUE,
add.rownames=FALSE, ...)
summary:是否汇总数据文件。
standAlone:导出的Latex代码应该是独立可编译的,还是应该粘贴到另一个文档中。
add.rownames:是否应该将行名添加到表中(在第一列之前插入一列)。
# Create a file name
filen <- tempfile(pattern="table_aov") # or
# filen <- paste("YOUR_DIR/table_aov")
# Generate ANOVA output
fit=aov(yield ~ block + N * P + K, data=npk) # 'npk' dataset from base 'datasets'
x=summary(fit)
# Export to Latex in standAlone format
table2tex(x=x,file=filen,add.rownames=TRUE)
# Export to Latex to paste in tex document
summary(fit) # get output from the console
table2tex(file=filen, standAlone=FALSE,add.rownames=TRUE)
# Export to HTML
table2html(x=x,file=filen) # or
summary(fit) # get output from the console
table2html(file=filen,add.rownames=TRUE)
导出到html或tex中的表格数据:
*请认真填写需求信息,我们会在24小时内与您取得联系。