vb.net报表设计器 web报表设计器实现

怎么用VB.net visual basic项目编写天气预报程序

Visual Basic通用报表设计小结

专注于为中小企业提供网站建设、成都网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业潜山免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

本文对vb设计报表的方法作了一个小结,大家都知道,在VB平台下制作报表大致有两种选择:使用VB自带的Data Report控件和借助第三方软件。其中第三方软件比较著名的就是MS Excel和Seagate公司的CrystalReporter,以下就这三个方案进行详细的讨论。

1. Data Report控件

1.1 Data Report控件使用方法

由于是VB自带的控件,所以使用相对比较方便。使用方法是:首先在"工程"菜单下面选择"添加Data report"选项,这样Data Report控件就选入到了应用程序。

使用Data report的情况大多数采用数据绑定的模式,也就是将此控件与数据库的数据表绑定起来以便可以不用编写代码就轻松完成报表的设计。要使用数据绑定就必须要指定数据源,这里的数据源不是数据控件而是数据环境(Data Environment),选择"工程"菜单下面选择"添加Data Environment"选项就可以将数据环境添加进应用程序中。数据环境有两个重要的属性:Connection 和Command属性,前者是连接指定的数据库,后者连接指定的数据表,一旦这两者都设置成功之后,就可以把数据环境作为数据源了。只需要把Data report的DataSource属性设置为前面的数据环境对象以及把DataMember设置为数据环境对象的Command对象即可。

1.2 Data Report控件界面元素

完成了Data report控件的数据绑定工作之后就可以直接控制报表的制作与显示了。这里首先熟悉一下Data report控件的显示界面:

Data report控件一共有5个区组成,分别是报表头、页面头、细节区、页面注脚和报表注脚。报表头和报表注脚是用分别用于整个报表的最上部和最下部,它们将出现于整个报表的每一页,可以放置一些报表名称,时间之类的固定文本;页面头和页面注脚只能出现在当前页的最上部和最下部,也就是说它只能出现在当前页中,不出现在其他页面中,可以放置随页面变化的一些量比如页码等;而细节区就是用来进行实际显示的区域,它是我们最为关心的区域,通过在此区域内放置显示控件可以控制报表的实际显示输出。这里介绍一下放置文本框控件的使用方法,其实在绑定情况下只需要设置其DataMember和Datafield即可,前者用来指定数据表,可以设置为前面数据环境对象的Command对象,后者是指定数据段,即绑定的数据库的指定字段。这样不需要编写任何代码就可以实现报表的显示工作。

1.3 Data Report控件的打印功能

对于报表的打印可以直接使用Data report自带的打印功能,即可以实现简易的报表打印。不过为了实现比较复杂的打印功能,也可以通过程序控制的方法来进行。这里只是给出一个实现思路:首先需要制作一个按钮控件来显示"打印设置"的窗口,通过这个窗口用户可以设置打印的相关的参数,然后在实现打印的子模块中使用VB内嵌的printer对象来实现真实的打印,该对象能够对打印的当前位置进行定位,而且对打印的字体等参数进行控制,所以结合"打印设置"窗口可以实现类似于word里面的打印功能。

2.MS Excel

说起报表设计应用程序,无意微软的Excel是一支独秀,MS Excel就是用来进行表格和报表设计用的应用程序,它具有优秀的方格控制和宏代码定制功能。所以如果在设计自己的应用程序的时候能够结合到Excel的话,那么你的应用程序就应该是相当的完善了,因为无论是编辑还是打印功能,Excel都提供了很完美的解决方案,所以你的应用程序所要做的事情就是实现程序和Excel通讯即可。

事实上,可以使用VBscript可以将VB与Excel两者连接起来。以下就简要介绍在VB下开发基于Excel的编程思路。

在VB中处理Excel的对象大致分为五个:Application对象、WorkBook对象、WorkSheet对象、Range对象以及Cell对象。它们的功能分别如下:

Application---------用来指代整个应用程序。

WorkBook----------表示工作簿对象

WorkSheet---------表示工作表对象,注意,一个工作簿可以包含多个工作表,它们就类似于多文档中的框架窗口和里面的单个视图一样。

Range-------------表示工作表中的某个区域范围对象,特殊情况下也可以只代表一个Cell。

Cell---------------表示特定工作表的一个单元格对象。这个对象的使用频率是最高的。

清楚了以上的五个对象的应用范围,那么使用它们就很简单了,不过在使用这些对象之前,首先需要对它们进行声明。方法是在"工程"的"引用"对话框之下选择"Microsoft Excel9.0 Object Library",这样就将整个Excel对象库就引入到程序中来了。

下面举一个示例,其实现的功能是打开一个工作簿。

Function OpenBook(strFilePath As String) As Boolean

' This procedure checks to see if the workbook

' specified in the strFilePath argument is open.

' If it is open, the workbook is activated. If it is

' not open, the procedure opens it.

Dim wkbCurrent As Excel.Workbook

Dim strBookName As String

On Error GoTo OpenBook_Err

' Determine the name portion of the strFilePath argument.

strBookName = NameFromPath(strFilePath)

If Len(strBookName) = 0 Then Exit Function

If Workbooks.Count 0 Then

For Each wkbCurrent In Workbooks

If UCase$(wkbCurrent.Name) = UCase$(strBookName) Then

wkbCurrent.Activate

Exit Function

End If

Next wkbCurrent

End If

Workbooks.Open strBookName

OpenBook = True

OpenBook_End:

Exit Function

OpenBook_Err:

OpenBook = False

Resume OpenBook_End

End Function

3.Crystal Reporter(水晶报表)

做为一个优秀的报表软件,水晶报表是实际应用中最多的方案。在这一节里主要介绍一下水晶报表的定制和显示,打印功能的实现。

首先要区分Crystal Reports插件程序和Crystal Reports控件。前者主要用来创建报表模板,后者主要是用来在程序中显示和打印报表,这两者的分工决定了它们程序中的功能的不同。

其中Crystal Reports的插件程序可以从Seagate公司的官方网站上下载最新的测试版本。

3.1 Crystal Reports插件程序的使用

选择"外接程序"菜单的"报表设计器"选项,则VB将执行Crystal Reports Pro插件应用程序。在Crystal Reports Pro里选择"新建报表"图标,可以选择8标准模板和一个自定义的模板来开始报表工程。

整个水晶报表的使用跟第一节的Data Report的使用很类似。首先需要给报表选择数据源,(即数据库),然后就可以在报表中添加、删除、修改字段以及为记录分组,可以利用水晶报表创建很多具有自定义风格的报表。由于本身Crystal Reports插件程序就是一个功能强大的报表设计软件,这里就不能一一的讲解了,有兴趣可以参考程序自带的帮助文档。

3.2 Crystal Reports控件的背景知识

Crystal Reports Pro还提供一个报表生成模块,该模块可以连接到并访问VB应用程序,VB程序员不需花费大量时间写自己的代码就可再应用程序中添加复杂的报表生成及输出功能。

Crystal Reports引擎是一个动态链接库,它可以使应用程序访问并具有同Crystal Reports 一样强大的报表输出功能。应用程序是通过Crystal Reports ActiveX控件来访问引擎。再编译时应用程序同报表引擎链接,以给应用程序添加了生成报表的功能。

当程序使用Crystal Reports ActiveX控件时,可以通过再设计时设置Crystal对象属性或者再运行时改变对象属性,来建立应用程序和Crystal Reports之间的连接。通过Crystal控件的属性可以指定:

响应应用程序某个事件的输出报表的名字。

报表的目标位置(预览窗口、磁盘文件或者电子邮件等)。

想要打印的份数(如果报表提交给打印机的话)。

输出文件的信息。

预览窗口的大小及位置信息(如果报表在预览窗口中显示时)。

选择公式信息(如果在报表中限制记录的话)。

排序信息。

其他相关的属性。

这里要注意一点的是,Crystal控件必须在由Crystal Reports Pro创建的报表中使用,而试图在VB应用程序里引用之前,必须首先创建报表。

3.3 Crystal Reports控件的使用

了解了Crystal Reports控件的功能,那么就可以使用它了。首先通过"工程"的"部件"选项里面选择"Crystal Reports Control",那么VB的工具箱里面就添加了Crystal Reports控件了。

注意,对于Crystal Reports控件的最重要的属性就是ReportFileName了,把它设置为前面已经在Crystal Reports Pro里定制好的报表模板的文件路径。那么只需要调用控件的PrintReport方法就可以将报表显示出来了。

相对于Data Report控件来说,Crystal Reports控件的功能更加的完善,报表预览,打印,编辑修改等功能都很完善,所以在实际的报表应用设计方案中,使用Crystal Reports的相对较多。然而Crystal Reports控件也有它的局限性,即它不能在运行时创建自定义的窗口。可以使用控件的数据绑定属性来创建数据绑定报表,但是报表本身的格式都是由Crystal Reports控件内部进行处理的。一般说来,Crystal Reports控件不提供在程序中对报表字段级的访问。这一缺陷可以通过设计出足够多的报表来弥补。

4.其他方法

除了通过上述的三种方法来实现报表设计以外,当然也可以直接利用Win32 API来进行直接进行设计,这种方式是最为灵活也是最为繁琐的方式,因为所有的编辑、修改、打印等功能都是由程序控制,所以一般情况下不会使用这样的方式来处理,这里就不介绍了。

5.小结

报表设计是程序员经常要遇到的问题,本文主要介绍目前主流的报表设计方案,由于所涉及到的知识点比较多,限于篇幅,在这里只是作了简要的介绍,希望可以起到抛砖引玉的作用。

用VB.NET结合Excel设计统计生产报表

用EXCEL做企业生产报表的理由 Excel表格生成和公式设置十分强大便利 是一个强有力的信息分析与处理工具 特别是EXCEL的公式 函数 VBA语言 功能极其强大 我试用过其他电子表格软件 在功能上和EXCEL根本没有可比性 Visual Studio NET也同样是MicroSoft的产品 Visual Studio NET调用EXCEL做企业报表十分方便 证明当时我选Visual Studio NET作为首选开发工具是正确的 软件构思 先在EXCEL里定制好名为《统计表》的样表(模版) 在样表中设置好各种格式 填写好固定项 在窗体上放很三个控件 两个DateTimePicker控件 用来选择开始统计时间和结束统计时间 一个Button以启动程序 软件欲实现的功能是 点击Button 自动查找符合日期符合日期范围的生产计划工作表 然后利用SortedList统计各个办事处的计划数量和未完成数量 及各个产品型号的计划数量和未完成数量 再把SortedList的数据读出写到《统计表》中 这里要注意的是 各个生产报表格式必须规范统一 因为程序是按照固定单元格位置读取数据的 SortedList类 除了具备VB NET调用EXCEL的基础知识外 本例主要用到SortedList类 SortedList类表示键/值对的集合 这些键和值按键排序并可按照键和索引访问 SortedList 是 Hashtable 和 Array 的混合 当使用 Item 索引器属性按照元素的键访问元素时 其行为类似于 Hashtable 当使用 GetByIndex 或 SetByIndex 按照元素的索引访问元素时 其行为类似于 Array SortedList 在内部维护两个数组以将数组存储到列表中 即 一个数组用于键 另一个数组用于相关联的值 每个元素都是一个可作为 DictionaryEntry 对象进行访问的键/值对 键不能为空引用(Visual Basic 中为 Nothing) 但值可以 SortedList 的容量是列表可拥有的元素数 随着向 SortedList 中添加元素 容量通过重新分配按需自动增加 可通过调用 TrimToSize 或通过显式设置 Capacity 属性减少容量 SortedList 的元素将按照特定的 IComparer 实现(在创建 SortedList 时指定)或按照键本身提供的 IComparable 实现并依据键来进行排序 不论在哪种情况下 SortedList 都不允许重复键 VB NET结合EXCEL统计生产报表 以下是实现代码 供参考 为方便初学者 部份地方加以注释 Private Sub Form _Load(ByVal sender As Object ByVal e As System EventArgs) Handles MyBase LoadDateTimePicker MaxDate = Date NowDateTimePicker MinDate = # / / #DateTimePicker MaxDate = Date NowDateTimePicker MinDate = # / / #End SubPrivate Sub 灶具分析统计()Call killEXCEL()Dim excelApp As New Excel ApplicationDim 佳尼 灶具生产计划 As Excel WorkbookDim 行号 As Integer = Dim 列号 As Integer = Dim 办事处计划数统计 As New SortedListDim 办事处完成数统计 As New SortedListDim 型号计划数统计 As New SortedListDim 型号完成数统计 As New SortedListDim 统计表 As Excel Worksheet Try佳尼 灶具生产计划 = excelApp Workbooks Open( E:\my documents\生产计划\佳尼 灶具生产计划 xls )统计表 = CType(佳尼 灶具生产计划 Worksheets( 统计表 ) Excel Worksheet)统计表 Cells( ) value = DateTimePicker Value ToShortDateString 统计开始日期统计表 Cells( ) value = DateTimePicker Value ToShortDateString 统计结束日期统计表 Range( c :z ) Value = 先清空统计表中原来有关数据统计表 Range( c :z ) Value = Dim 生产计划表 As Excel WorksheetFor Each 生产计划表 In 佳尼 灶具生产计划 Worksheets 遍历生产计划表If Strings Left(生产计划表 Name ) = Or Strings Left(生产计划表 Name ) = Then 如果是 或 开头的表名 因生产计划表名是 或 开头 MsgBox(生产计划表 Name)行号 = 生产计划表中生产数据从第四行开始列号 = 第 列是计划下发日期 从计划下发日期判断是否是所要数据Dim 临时行号 As Integer = 求得工作表中最后一行所在的行号 从第四行开始往下计算While 生产计划表 Cells(临时行号 列号) value Nothing MsgBox(生产计划表 Cells(行号 列号) value 行号)临时行号 += End While临时行号 = 得到生产计划表中 最后数据行所在的行号 MsgBox(临时行号)For 行号 = To 临时行号 生产计划标准格式行号从 开始 到工作表中最后一行If (CDate(DateTimePicker Value ToShortDateString) = CDate(生产计划表.Cells(行号, 列号).value)) And (CDate(DateTimePicker2.Value.ToShortDateString) = CDate(生产计划表 Cells(行号 列号) value)) Then 如果日期在规定范围内 灶具各城市分布情况Dim 城市 As String = 生产计划表 Cells(行号 ) value 第 列是城市名称Dim 计划数 As Decimal = CType(生产计划表 Cells(行号 ) value Decimal) 第 列是计划数Dim 完成数 As Decimal = CType(生产计划表 Cells(行号 ) value Decimal) 第 列是实际完成数Dim 未完成数 As Decimal = 用Decimal是因为后面要加小数If 完成数 计划数 Then '如果没有完成未完成数 = 计划数 - 完成数End IfIf 城市 "" ThenIf InStr(城市, "沈阳") 0 Or InStr(城市, "鞍山") 0 Or InStr(城市, "哈尔滨")   0 Or InStr(城市, "葫芦岛") 0 ThenIf 办事处计划数统计.Contains("沈阳") Then办事处计划数统计.Item("沈阳") += 计划数Else办事处计划数统计.Add("沈阳", 计划数)End IfIf 办事处完成数统计.Contains("沈阳") Then办事处完成数统计.Item("沈阳") += 未完成数Else办事处完成数统计.Add("沈阳", 未完成数)End IfElseIf 办事处计划数统计.Contains(城市) Then办事处计划数统计.Item(城市) += 计划数Else办事处计划数统计.Add(城市, 计划数)End IfIf 办事处完成数统计.Contains(城市) Then办事处完成数统计.Item(城市) += 未完成数Else办事处完成数统计.Add(城市, 未完成数)End IfEnd IfElseMsgBox(生产计划表.Name "没有城市名称", MsgBoxStyle.Critical, "生产计划中要有城市名称")excelApp.Visible = True生产计划表.Activate()生产计划表.Select()End If'以下计算灶具型号分布情况Dim 型号 As String = Strings.Left(生产计划表.Cells(行号, 2).value, 3) '灶具型号在第3列If 型号计划数统计.Contains(型号) Then型号计划数统计.Item(型号) += 计划数Else型号计划数统计.Add(型号, 计划数)End IfIf 型号完成数统计.Contains(型号) Then型号完成数统计.Item(型号) += 未完成数Else型号完成数统计.Add(型号, 未完成数)End IfEnd IfNextEnd IfNextDim 城市数 As Integer = 办事处计划数统计.CountDim 城市数clone As Integer = 办事处计划数统计.Count行号 = 4'依计划数大小排序Dim 办事处计划数统计副本 As New SortedListDim asa As Decimal = 0.001 '加上此数是为了防止键值的重复,在工作表中可选不显示小数Dim 办事处计划数Enum As IDictionaryEnumerator = 办事处计划数统计.GetEnumeratorWhile 办事处计划数Enum.MoveNext办事处计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)asa += 0.001End While'这里利用SortedList自动排序的功能Dim i As Integer = 1For 列号 = 3 To 3 + 城市数 - 1 '从第三列开始填写数据,这是预先定义的格式统计表.Cells(行号, 列号).value = 办事处计划数统计副本.GetByIndex(城市数clone - i) '城市统计表.Cells(行号 + 1, 列号).value = 办事处计划数统计副本.GetKey(城市数clone - i) '计划数统计表.Cells(行号 + 2, 列号).value = 办事处完成数统计.Item(办事处计划数统计副本 .GetByIndex(城市数clone - i)) '计划数i += 1Next'以型号计划数多少排序Dim 型号计划数统计副本 As New SortedList办事处计划数Enum = 型号计划数统计.GetEnumeratorWhile 办事处计划数Enum.MoveNext型号计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)asa += 0.001' MsgBox(办事处计划数Enum.Valu lishixinzhi/Article/program/net/201311/11282

开发报表大家会选择使用那一款开发了?在C#中

ActiveReport ActiveReport 是.net下的一个出色的报表开发程序,虽然和水晶报表相比,名气不那么大,甚至有很多人不知道它的存在,但是并不妨碍它在.net报表开发中的出色表现. 一. ActiveReports for .net的主要功能介绍 支持ASP.NET-ActiveReports在WebForms应用程序中通过使用ASP.NET 服务器控件来使用。这个控件支持分布式web报表,可使用HTML,ActiveX,.NET 和PDF浏览器。完全代码集成-使用Microsoft Visual Studio.NET编辑器用C#或VB.NET编写报表的代码,非常灵活。报表向导-报表向导帮助您开始创建使用集成设计器来定制的简单报表。设计器-对象模版完全显现的对象模版。允许您动态的建立和修改报表Report Creation API提供了完整的运行时访问报表对象和成员功能。最终用户报表设计器终端用户设计器为您提供了向您应用程序中加入设计器的功能,同时提供了终端用户报表编辑功能。控件的方法和属性能方便的存储和加载报表布局,监测和控制设计环境,并可根据终端用户的需要定制外观。与ASP.NET集成Web浏览器控件为您提供了web上的快速浏览ActiveReports 以及打印功能,并具有ActiveX浏览器和Acrobat Reader 浏览器类型的属性。RPX 文件HTTP处理器为您提供了在web服务器上轻松的放置报表的功能,并可使您的Internet用户采用HTML 或PDF进行浏览,而不需要编写任何代码。编译的报表HTTP处理器提供了直接访问服务器的程序集中编译的ActiveReports,而不需要编写任何ASPX页面。发布-容易部署报表引擎是一个简单处理强名称程序集。程序集可以使用XCopy发布或放置于程序集全局存储器中(GAC)。专业版包括HTTP 处理器和服务器并行web控件,用于ASP.NET 报表。设计器-容易学习与.NET 环境完全集成熟悉的用户界面支持C#和Visual Basic.NET报表将作为您应用程序中的一部分进行编译,以加快处理速度,增强安全性,并且用户可以有选择的分别发布。初学者报表向导和Microsoft Access 报表导入向导设计器拥有第三方控件(图表控件,图像控件等)。数据访问-容易连接包括OLEDB和SqlClient报表数据源包括灵活的xml数据源绑定到Dataset,DataView,DataTable和任何IListSource 控件数据源属性能在运行时修改,生成ad hoc(动态)报表灵活的非绑定数据预览和输出-容易显示支持C#代码小型部署程序集,适用于Internet 上使用TOC/Bookmarks超链接输出过滤文件格式为RTF、PDF、EXCEL、HTML、TIFF 和文本文件。官方网站: 二.注册 下面代码放置在***.exe.config或者Web.config里面: appSettings addkey="DataDynamicsARLic" value="DD-APN-10-C001733,DD-APN-10-C001733,DD-APN-10-C001733,XY6Y7KQBTY12323KJCKJ" / /appSettings 每个方案旋转文件licenses.licx后,重新生成: DataDynamics.ActiveReports.ActiveReport, ActiveReports, Version=1.2.2003.630, Culture=neutral, PublicKeyToken=dbe4120289f9fd8a 右边红线出现,是因为报表超出长度限定,如果那样打印的话,会多带出一张空白纸。 1 Left margin + right margin + printwidth must be less than the paper width 2 While right.margin 1.0 then it will appear 三.使用指南此控件目前的文档很少,参见参考资料,只能自己看SAMPLES或者下载E文文档 汉化ActiveReports 2.0界面 Public Sub Creport(AReport As ActiveReport) '汉化ActiveReport '以下适用2.0 With AReport .ToolBar.Tools.Item(0).Tooltip = "各页目录" .ToolBar.Tools.Item(2).Caption = "打印..." .ToolBar.Tools.Item(2).Tooltip = "打印报表" .ToolBar.Tools.Item(4).Tooltip = "拷贝" .ToolBar.Tools.Item(6).Tooltip = "查找" .ToolBar.Tools.Item(8).Tooltip = "单页显示" .ToolBar.Tools.Item(9).Tooltip = "多页显示" .ToolBar.Tools.Item(11).Tooltip = "缩小" .ToolBar.Tools.Item(12).Tooltip = "放大" .ToolBar.Tools.Item(15).Tooltip = "" .ToolBar.Tools.Item(16).Tooltip = "" .ToolBar.Tools.Item(19).Tooltip = "后退" .ToolBar.Tools.Item(19).Caption = "后退" .ToolBar.Tools.Item(20).Tooltip = "前进" .ToolBar.Tools.Item(20).Caption = "前进" End With End Sub 四.如何发布 ActiveReports for .NET 程序集 有两种部署 ActiveReports 程序集的方法。每种方法根据您的安装方法而定。 如果您正将工程从开发计算机拷贝到您的服务器上,您需要将工程引用中的 ActiveReports 引用设置为 CopyLocal = True。这样 ActiveReports DLL 将在编译工程中的 bin 文件夹中。 如果您正为您的软件制作安装程序,您需要包含 ActiiveReportsDistrib.MSM 文件,该文件将包含在 ActiveReports for .NET 的安装中。例如,该文件可能被安装在C:\Program Files\Data Dynamics\ActiveReports for .NET\Deployment 文件夹中。

VB.net中如何制作水晶报表?

这个专业我也学得不是很好,用书上得例子吧。

某公司尽力需要了解公司在全国各地得销售情况,设计一个水晶报表。统计个地区得销售总额和全国总额

准备工作

用 SQL server 2000 创建一个数据库company 在该数据库中创建一个表Sales.用于储存区域销售数据

在表Sales 中添加若干条记录

设计报表

打开 Visual Studio.NET创建名为 Salesreport得 WINDOWS应用程序 将Form1.cs 名更改为 frmSalesReport.cs

frmSalesReport窗体得属性设置里。 吧 frmSalesReport.cs得Text属性更改为"区域销售报表"

把NAME属性更改为frmSalesReport。

在 VisualStudio.NET 菜单中选择 项目添加新项。在"添加新项"窗口得“类别”区域扩展 “本地项目项”,选择数据,在"模板"区域选择"数据集" 在"名称"那将Dataset1.xsd改名 SalesDetaset.xsd

单击"打开" 将生成一个新得结构文件 SalesDataset.xsd 该文件将显示在 ADO.NET数据集设计器中。


新闻标题:vb.net报表设计器 web报表设计器实现
本文来源:http://bzwzjz.com/article/doghjps.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站设计 成都网站建设 移动网站建设 四川成都网站制作 网站制作 成都网站建设 攀枝花网站设计 成都网站建设 成都网站制作 网站设计制作 重庆网站建设 成都响应式网站建设 成都企业网站建设公司 专业网站建设 营销型网站建设 成都网站设计 网站建设 泸州网站建设 成都网站设计 成都网站设计 网站设计 定制网站设计