本文利用Visual Studio 2017 C#编写一个简单的WEB程序发布和部署到局域网内,目的是实现:在局域网内任意一台未安装OFFICE办公软件的电脑上打开浏览器后在地址栏输入IP地址和端口号,即可链接到WEB网页,点击【导出到EXCEL文件】按钮,即可实现将MySQL数据库中的数据通过NPOI导出到EXCEL文件中。
(1)、说明:我的电脑在局域网中IP地址为192.168.16.157,另外局域网的端口号为5000。打开浏览器,在地址栏输入
即可弹出如下的WEB网页。
(2)、如何查看我的电脑在局域网中的IP地址
第一步:进入命令提示符窗口
第二步:输入 IPCONFIG
上图中,IPV4地址后面的 192.168.16.157 就是我的这台电脑在局域网中的IP地址
一、WIN10操作系统开启IIS服务
1、请参阅博主另外一篇文章:https://blog.csdn.net/ba_wang_mao/article/details/105242831
2、还可以参考这个博主的文章《Win10下IIS配置图解、MVC项目发布图解、IIS添加网站图解 》
https://www.cnblogs.com/zhao123/p/5588888.html
3、还可以参考这个博主的文章《Windows10下安装IIS并发布网站》
https://jingyan.baidu.com/article/ceb9fb1074357b8cac2ba058.html
4、还可以参考这个博主的文章《Win10下IIS配置、项目发布、添加网站》
https://blog.csdn.net/qq_22642239/article/details/77006831?utm_source=blogxgwz1
5、还可以参考这个博主的文章《Win10下IIS配置、项目发布、添加网站》
https://blog.csdn.net/zgscwxd/article/details/88838807
二、创建项目ASP.net Web 应用程序
二、创建一个Web窗体
三、添加MySQL数据库
1、鼠标单击引用
2、弹出引用管理器窗口
单击浏览,找到MySQL数据库,参见下图(前提是你已经安装好MySQL数据库系统)。左边打勾,然后单击确定按钮。
可以观察到,在引用下多了MySql.Data,表示添加成功。
安装完毕,可在右边的【引用】中观察到MySQL库,即:MySql.Data。
四、下载NPOI组件
当目标电脑没有安装OFFICE办公软件时,要想将MySQL库中的数据导出到EXCEL文件,最好的办法是使用NPOI组件,NPOI组件可以让你在没有安装OFFICE办公软件的环境下将MySQL库中的数据导出到EXCEL文件。
有2种途径下载NPOI控件,方法1是在官网下载。方法2是利用Visual Studio 2017的NuGet包管理器。
下面我们介绍第2种方法,利用Visual Studio 2017的NuGet包管理器下载,可以直接下载到DLL库,而且版本是最新的。
鼠标点击【浏览】,在输入框中输入NPOI,会在下面出现NPOI下载项(我下载的时候NPOI最新版本为V2.5.1)。
鼠标选中NPOI下载项,右边会出现【版本:】和【安装】。【版本:】下拉菜单找到最新稳定版2.5.1,然后鼠标单击【安装】
安装完毕,可在右边的【引用】中观察到NPOI库,包括: LCSharpCode.SharpZIPLib,NPOI,NPOI.OOXML,
NPOI.OpenXml4Net,NPOI.OpenXmlFormats。
五、编写代码
1、在WebForm1.aspx中添加一个按钮,命名为btnExport,按钮文本为“导出到EXCEL”。
2、在WebForm1.aspx.cs中编写代码
(1)、一定要添加MySQL的命名空间
using MySql.Data.MySqlClient;
(2)、一定要添加NPOI的命名空间
using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
(3)、添加程序代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnExport_Click(object sender, EventArgs e)
{
string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
//string sql = "select * from Brand";//声明一个字符串,用来存放查询数据库表语句
MySqlConnection con = new MySqlConnection(constr);//创建一个SqlConnection对象,由于我使用的是MySQL数据库,因此注意要引用using MySql.Data.MySqlClient;
try //将可能出错的语句放在try语句里
{
con.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * from Brand where BrandId>=1 && BrandId <=3"; //声明一个字符串,用来存放查询数据库表语句
MySqlDataReader reader = cmd.ExecuteReader();
DataTable dt = ReaderToTable(reader);
ExportExcel(dt);
con.Close();
con.Dispose();
cmd.Dispose();
reader.Close();
dt.Dispose();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
protected DataTable ReaderToTable(MySqlDataReader dr)
{
DataTable dt = new DataTable();
for (int i = 0; i < dr.FieldCount; i++)
{
dt.Columns.Add(dr.GetName(i), dr.GetFieldType(i));
}
object[] objValues = new object[dr.FieldCount];
while (dr.Read())
{
dr.GetValues(objValues);
dt.LoadDataRow(objValues, true);
}
dr.Close();
return dt;
}
protected void ExportExcel(DataTable dt)
{
HttpContext curContext = HttpContext.Current;
//设置编码及附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
string fullName = HttpUtility.UrlEncode("FileName.xls", Encoding.UTF8);
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(fullName, Encoding.UTF8)); //attachment后面是分号
byte[] data = TableToExcel(dt, fullName).GetBuffer();
curContext.Response.BinaryWrite(TableToExcel(dt, fullName).GetBuffer());
curContext.Response.End();
}
public MemoryStream TableToExcel(DataTable dt, string file)
{
//创建workbook
IWorkbook workbook;
string fileExt = Path.GetExtension(file).ToLower();
if (fileExt == ".xlsx")
workbook = new XSSFWorkbook();
else if (fileExt == ".xls")
workbook = new HSSFWorkbook();
else
workbook = null;
//创建sheet
ISheet sheet = workbook.CreateSheet("Sheet1");
//表头
IRow headrow = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell headcell = headrow.CreateCell(i);
headcell.SetCellValue(dt.Columns[i].ColumnName);
}
//表内数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//转化为字节数组
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}
}
程序代码发现如下错误
(4)、添加using System.Data;后DataTable错误消失。
using System.Data;
(5)、添加using System.Text; 后Encoding错误消失。
using System.Text;
(6)、添加using System.IO; 后Path和MemoryStream错误消失。
using System.IO;
(7)、把按钮btnExport的关联由Page_Load修改为btnExport_Click,参见下图
(8)、完整的源程序如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using System.Text;
using System.IO;
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnExport_Click(object sender, EventArgs e)
{
string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
//string sql = "select * from Brand";//声明一个字符串,用来存放查询数据库表语句
MySqlConnection con = new MySqlConnection(constr);//创建一个SqlConnection对象,由于我使用的是MySQL数据库,因此注意要引用using MySql.Data.MySqlClient;
try //将可能出错的语句放在try语句里
{
con.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * from Brand where BrandId>=1 && BrandId <=3"; //声明一个字符串,用来存放查询数据库表语句
MySqlDataReader reader = cmd.ExecuteReader();
DataTable dt = ReaderToTable(reader);
ExportExcel(dt);
con.Close();
con.Dispose();
cmd.Dispose();
reader.Close();
dt.Dispose();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
protected DataTable ReaderToTable(MySqlDataReader dr)
{
DataTable dt = new DataTable();
for (int i = 0; i < dr.FieldCount; i++)
{
dt.Columns.Add(dr.GetName(i), dr.GetFieldType(i));
}
object[] objValues = new object[dr.FieldCount];
while (dr.Read())
{
dr.GetValues(objValues);
dt.LoadDataRow(objValues, true);
}
dr.Close();
return dt;
}
protected void ExportExcel(DataTable dt)
{
HttpContext curContext = HttpContext.Current;
//设置编码及附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
string fullName = HttpUtility.UrlEncode("FileName.xls", Encoding.UTF8);
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(fullName, Encoding.UTF8)); //attachment后面是分号
byte[] data = TableToExcel(dt, fullName).GetBuffer();
curContext.Response.BinaryWrite(TableToExcel(dt, fullName).GetBuffer());
curContext.Response.End();
}
public MemoryStream TableToExcel(DataTable dt, string file)
{
//创建workbook
IWorkbook workbook;
string fileExt = Path.GetExtension(file).ToLower();
if (fileExt == ".xlsx")
workbook = new XSSFWorkbook();
else if (fileExt == ".xls")
workbook = new HSSFWorkbook();
else
workbook = null;
//创建sheet
ISheet sheet = workbook.CreateSheet("Sheet1");
//表头
IRow headrow = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell headcell = headrow.CreateCell(i);
headcell.SetCellValue(dt.Columns[i].ColumnName);
}
//表内数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//转化为字节数组
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}
}
编译程序
在本机上运行
下面是在本机上运行WEB程序,点击【导出到EXCEL文件】将数据库中的数据导出到EXCEL文件的截屏
到这里一个简单的demo 接口就完成了
六、发布
弹出选取发布目标窗口
先点击文件夹,然后点击创建配置文件(P)
先点击文件夹,然后点击创建配置文件(P)会弹出如下窗口,然后点击新建配置文件
然后点击新建配置文件,又会弹出选取发布目标窗口。
先点击文件夹,然后点击创建配置文件(P),在下面的下拉窗口中选择【立即发布】
发布成功
发布完成后,D:\WEB\WebApplication1\WebApplication1\bin\Release\Publish中存放的是发布的内容。
注意:我在发布时设置的路径为 bin\Release\Publish
七、在局域网内我的电脑上部署(在IIS上添加网址)
将WEB网页部署在我的电脑上,让局域网内任意一台电脑访问。
1、此电脑点击右键,弹出下拉菜单,选择管理(G)
2、打开【IIS管理器】
3. 添加网址:单击【网站】,【添加网站】
网站名称随便起,物理路径为项目发布的路径。这里的端口需要注意,不要起已经被占用的端口。注意:我在发布时设置的路径为 bin\Release\Publish
在网站名称(S):的输入框中输入 WebExcel ,说明网站名称可随意输入,你想怎么命名就怎么命名,输了网站名称后,后面的【应用程序池(L):】中的输入框中自动出现了网站名称WebExcel
由于我之前发布网站时发布到了D:\WEB\WebApplication1\WebApplication1\bin\Release\Publish,因此物理路径(P):必须添加上述路径。
由于局域网服务器的端口号为5000,我的电脑在局域网中的IP地址为192.168.16.157,我需要将WEB网页发布到我的电脑上,好让局域网上其它电脑访问WEB网页。
点击【确定】按钮,返回计算机管理窗口
鼠标单击右边的【浏览网站 浏览192.168.16.157:5000】,弹出如下错误信息
HTTP错误 403.14 - Forbidden 错误的解决方法,参见:https://blog.csdn.net/weixin_43481571/article/details/83690182
有很多人在用服务器发布网站的时候,一直出现 “HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容“,那么是什么原因引起的呢!
方法/步骤
1、当然导致这个问题出现的原因可能很多,但在本地运行调试,不至于存在IP被列入黑名单、网站域名解析到了空间、被防火墙拒绝访问等原因,所以问题重点应 IIS 管理器上!
2.至于怎样配置安装ISS的这里就不说了,我们打开 IIS 管理器,转到自己定义好的页面上!
3.在”功能视图“,中找到【目录浏览】双击进入,或者单击【目录浏览】,然后单击【打开功能】
单击【启用】
单击【启用】后,参见下图
4.这时候返回ISS管理器的主页面
选择浏览网站(浏览192.168.16.157:5000),重新找自己网站,可以看到已经不报错了,但是只是以文件目录的形式!参见下图
5.我们希望的是浏览演示网站内容,这个才能直观的调试,其实这里我们只要设置好默认文档就就可以了!
6.重新回到IIS管理器主页,在”功能视图“中,选择”默认文档“!
7.在默认文档中默认的主页名称是default.aspx,而我的主页名称是WebForm1.aspx
点击【添加】,弹出【添加默认文档】对话框
我的主页名称是WebForm1.aspx,在上图的名称(N):输入WebForm1.aspx,然后单击【确定】按钮
7.再重新打开我们网站,就可以正常打开运行了
重新回到IIS管理器主页,鼠标单击右边的【浏览网站 浏览192.168.16.157:5000】
鼠标单击右边的【浏览网站 浏览192.168.16.157:5000】后,终于跳出了我的WEB主页。
八、在局域网内其它电脑上访问WEB网页,并实现MYSQL数据库导出到EXCEL文件
1、局域网内随便找一台电脑,打开浏览器,在地址栏输入 192.168.16.157:5000/
2、弹出WEB主页
3、单击【导出到EXCEL文件】,弹出【正在打开FileName.xls】对话框,点击【保存文件(S)】,然后点击【确定】按钮
4、过一会可以在这台电脑的下载文件夹中观察到导出的EXCEL文件(FileName.xls)
5、打开FileName.xls,可以观察到就是我们按照我们的查询要求导出的数据库中的数据。
致谢以下文章,是它们让我从一个C#小白,对WEB一无所知,到如今顺利编写完程序,并发布成功网页,并部署到服务器,最后在局域网任意一台电脑上都可以浏览。
https://blog.csdn.net/zhengfwei/article/details/79011183
Win 10 ASP.NET网站从创建到发布(VS2017)
https://blog.csdn.net/qq_42862167/article/details/100803240
使用VisualStudio发布ASP.NET网站
https://www.cnblogs.com/Van-Pire/p/4147180.html
win8 iis安装及网站发布(转)
https://www.cnblogs.com/Van-Pire/p/4147217.html
win8 iis安装及网站发布
https://www.cnblogs.com/molong/archive/2013/03/22/2975841.html
IIS发布网站后局域网其他用户不能访问问题(转)
https://www.cnblogs.com/Van-Pire/p/4146928.html
为什么IIS中找不到.net framework 4.5(转)
https://www.cnblogs.com/Van-Pire/p/4146787.html
windows8 安装IIS 和 添加网站(转)
https://www.cnblogs.com/Van-Pire/p/4146988.html
IIS发布网站:CS0016: 未能写入输出文件的解决方法
https://www.cnblogs.com/Van-Pire/p/4146751.html
微软公司---使用 Visual Studio 的 ASP.NET Web 部署:部署到测试
Visual Studio 2017(C#)、Microsoft Access 2010搭建ASP.NET网站(页面功能概述一)
https://www.pianshen.com/article/9912830590/
Visual Studio 2017安装教程
https://www.pianshen.com/article/67531099732/
HTTP错误 403.14 - Forbidden 错误的解决方法
https://blog.csdn.net/weixin_43481571/article/details/83690182
win10 IIS网站部署实录
https://blog.csdn.net/u014255803/article/details/73832072
win10 配置 IIS