''' <summary>

''' 把 DataTable 输出到 excel 文件

''' </summary>

''' <param name="dt_datas">DataTable</param>

''' <param name="excelFileName">excel文件名</param>

''' <returns>返回Excel.Worksheet,以便对其进行后续加工</returns>

''' <remarks></remarks>

Public Function datatableToExcel(dt_datas As DataTable, excelFileName As String) As Excel.Worksheet

 

' 判断这个excel文件是否已经打开了; 如果打开了,不能下载

Try

Dim fs As FileStream = New FileStream(excelFileName, FileMode.OpenOrCreate, FileAccess.Read)

fs.Close()

Catch ex AsException

MessageBox.Show(excelFileName & "文件当前已经打开,请先关闭,否则无法输出")

Return Nothing' 退出

End Try

 

Dim objArray(dt_datas.Rows.Count + 1, dt_datas.Columns.Count) As Object' 准备写入excel表格 的 二维矩阵

' 第0行: 各列的 列头

For jj = 0 To dt_datas.Columns.Count - 1

'objArray(0, jj) = strHeads(jj).Split(".")(1).ToUpper ' 列头 大写

' 上面以前,由于字段名类似于 a.alert_id 这样,所以对其进行拆分,然后取其后一个,但不能处理 alert_id

' 下面现在,对于 a.alert_id(虽然不大可能出现,但是以防万一) 或者 alert_id ,都可处理; 20191118

Dim ss As String() = dt_datas.Columns(jj).Caption.Split(".")

objArray(0, jj) = ss(ss.Length - 1).ToUpper ' 列头 大写

Next

 

' 具体数据

For ii = 0 To dt_datas.Rows.Count - 1

For jj = 0 To dt_datas.Columns.Count - 1

'objArray(ii + 1, jj) = dt_datas.Rows(ii).Item(jj).Value.ToString

' 上面是dgv中的写法,下面是 datatable 的写法

objArray(ii + 1, jj) = dt_datas.Rows(ii).Item(jj).ToString

Next

Next

' 上面统计结束,并写入二维矩阵中

' 下面将二维矩阵输出到excel

Dim excelApplication As New Excel.Application

excelApplication.Visible = False

Dim excelWorkBook As Excel.Workbook = excelApplication.Workbooks.Add()

'Dim excelWorkSheet As Excel.Worksheet = excelWorkBook.Worksheets.Add

'excelWorkSheet.Name = "table0" ' 自己定义的表名;注意 Sheet1\Sheet2\Sheet3是excel文件中自带的三个表名,这里由于是增加新表,所以不能用这三个表名

' 如果上面这行代码被屏蔽(就是没有指定表名),则使用 Sheet4 表名

Dim excelWorkSheet As Excel.Worksheet = excelWorkBook.Worksheets(1) ' 用现有的表名 Sheet1 ,注意 Worksheets 是从1开始

 

' 根据矩阵的大小 设定 excel表格 的 操作区域

Dim range As Microsoft.Office.Interop.Excel.Range = excelWorkSheet.Range("A1").Resize(objArray.GetLength(0), objArray.GetLength(1))

range.NumberFormat = "@"

range.HorizontalAlignment = Excel.XlHAlign.xlHAlignGeneral

range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter

range.Value = objArray ' 赋值

 

'' 设定 excel 的 单元格大小

With excelWorkSheet

.Cells.RowHeight = 20

.Cells.ColumnWidth = 20

End With

 

Try

excelWorkBook.SaveAs(excelFileName) ' 保存为 excel文件 , 位置根据配置文件

' 这里以excelFileName文件名进行保存,这个文件总是存在的,会弹出一个对话框,问要不要覆盖

' 用户点击对话框的 Yes 按钮,就会把这个文件覆盖掉,然后在 excel 里打开新的文件

Catch ex AsException' 如果出问题

' 这里出问题的原因就是 用户没有点击 Yes 按钮,而是点击了 No 或者 Cancel 按钮

' 此时可以以其他文件名保存

'MessageBox.Show(excelFileName & " 文件现在无法保存,原因:" & ex.ToString() & Chr(10) & Chr(13) & Chr(10) & Chr(13) & "您可以用其它文件名进行保存,请在接下来的输入框中输入文件名")

'MessageBox.Show(excelFileName & " 文件现在无法保存,您可以用其它文件名进行保存,请在接下来的输入框中输入文件名")

' 在excel文件无法保存的情况下,另外保存

Dim SaveFileDialog1 As System.Windows.Forms.SaveFileDialog = New System.Windows.Forms.SaveFileDialog

SaveFileDialog1.CheckFileExists = False' 不检查文件是否已经存在,似乎无用?

' SaveFileDialog1.Filter = "file excel(*.csv)|*.csv"

' 上面以前,以 csv 作为文件名的后缀,不够灵活

' 下面现在,以 输入文件名的后缀 作为文件名的后缀; 20191118

Dim ss As String() = excelFileName.Split("\") ' 获取文件名(去掉路径信息)

Dim sss As String() = ss(ss.Length - 1).Split(".") ' 获取文件名的后缀

SaveFileDialog1.Filter = "file excel(*." & sss(1) & ")|*." & sss(1)

 

SaveFileDialog1.FilterIndex = 2

SaveFileDialog1.RestoreDirectory = True

If SaveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then

excelWorkBook.SaveAs(SaveFileDialog1.FileName) ' 重新起个名字保存

End If

End Try

'MessageBox.Show("Download completed!")

excelApplication.Visible = True

' 收集垃圾,关闭进程

ReleaseComObject(excelApplication)

ReleaseComObject(excelWorkBook)

'ReleaseComObject(excelWorkSheet)

Return excelWorkSheet ' 返回 WorkSheet,以便用户对其进行一些后期处理(比如对某些区域上色等等)

End  Function

' 收集垃圾

Public Sub ReleaseComObject(ByRef obj AsObject)

Try

System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)

obj = Nothing

Catch ex AsException

obj = Nothing

Finally

GC.Collect()

End  Try

End  Sub

把 DataTable 输出到 excel 文件的更多相关文章

  1. C# 把datagridview控件上的表格输出到excel文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. DataTable导入到Excel文件

        ;                saveFileDialog.RestoreDirectory = ;            , intIndex] = column.ColumnName; ...

  3. 把页面的Table直接输出到Excel文件中

    有个需求是统计的时候,为生成的html表格提供导出功能,但是这样导出Excel不会显示自身的表格 影响美观,但是excel会显示html的css样式,这里可以通过处理行对象的方式进行导出,但是处理起纵 ...

  4. java中将从数据库查询的信息输出到excel文件中

    package com.cn.peitest.excel; import java.io.File; import java.lang.reflect.Field; import java.util. ...

  5. excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)

    将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...

  6. C#实现DataTable转为Excel文件

    实现DataTable转为Excel文件,和上次分享的Excel文件转为DataTable互为反操作.DataTable转化为Excel文件是通过传入一个DataTable类型的参数,然后将传入的Da ...

  7. .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

  8. 【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)

    Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个 ...

  9. PHP读取Excel文件内容

    PHP读取Excel文件内容   项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel.   PHPExcelReader比较 ...

随机推荐

  1. 原生PHP和MYSQL练习登陆验证和查询数据到表格

    直接上代码吧 <?php header("Content-type: text/html; charset=utf-8"); //数据量链接 $conn=mysqli_con ...

  2. netCore3.0+webapi到前端vue(前端)

    前篇已经完成后端配置并获取到api连接 https://www.cnblogs.com/ouyangkai/p/11504279.html 前端项目用的是VS code编译器完成 vue 第一步 引入 ...

  3. Python【day 10】函数进阶-动态函数

    形参小结 1.位置参数2.默认值参数3.动态参数 1.*args 位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组 2.**kwargs 关键字参数的动态传参. 系统会自动的把所有的关键字 ...

  4. 2019 梆梆安全java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.梆梆安全等公司offer,岗位是Java后端开发,因为发展原因最终选择去了梆梆安全,入职一年时间了,也成为了面 ...

  5. Lucene为什么要加Segment概念

    目前我感觉加了Segment有两个好处: 1. 简化了写文档的逻辑,解耦了写文档和读文档.如果没有Segment在写文档的时候势必要修改整个索引,所以会影响到文档的读 2. 提升了写文档的速度,由于只 ...

  6. 2.原生js实现图片懒加载

    网上查了很多图片懒加载的内容, 但基本上都是jQuery实现的, 没有说清楚其原理, 所以研究了一下 多的不说, 上代码, 看不明白的建议看下我的上一篇文章<1. 图解浏览器和用户设备的宽高等属 ...

  7. Linux查看系统当前登录用户的命令,top命令看到users有多个用户登录

    Linux查看系统当前登录用户的命令,top命令看到users有多个用户登录 作为系统管理员,top命令看到users有多个用户登录,会需要查看下是否被黑客进入了. 实战例子:top命令:top - ...

  8. [b0018] python 归纳 (四)_运算符重载

    # -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...

  9. Mysql Join-连接查询(上)

    认识 多表连接查询,我感觉应该是关系型数据库最能体现其价值和灵活性的地方吧. 我觉得数据库的作用, 归纳起来无非就是存储和查询. 一言蔽之,数据库就是能灵活地存储和查询数据. 存储上, 也是以文件的方 ...

  10. [TCP/IP] TCP流和UDP数据报之间的区别

    TCP流和UDP数据报之间的区别 1.TCP本身是面向连接的协议,S和C之间要使用TCP,必须先建立连接,数据就在该连接上流动,可以是双向的,没有边界.所以叫数据流 ,占系统资源多 2.UDP不是面向 ...