臺拖一個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小時內與您取得聯系。