数据库查询自动导出发送工具

该工具可以根据执行文件中的SQL查询SQL Server数据库中的信息,并将结果自动保存为Excel 2007格式的文件,并立即发送给指定邮箱,省去等待查询结果的时间。

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Net.Mail;
using System.Windows.Forms;

namespace QueryExporterAndPoster
{
    public partial class frmMain : Form
    {
        private string DatabaseName;
        private DateTime dtSpending;
        private string attachmentPath;
        private string sqlContent;
        private int CommandTimeout;
        private string connectionString;
        private bool isBusy = false;

        public frmMain(string ConnectionString, string DatabaseName)
        {
            InitializeComponent();
            this.connectionString = ConnectionString;
            this.DatabaseName = DatabaseName;
        }

        private Stream RenderDataTableToExcel(DataTable SourceTable, string sheetName, bool dateWithTime)
        {
            XSSFWorkbook workbook = null;
            MemoryStream ms = null;
            ISheet sheet = null;
            XSSFRow headerRow = null;
            try
            {
                workbook = new XSSFWorkbook();
                IDataFormat dateFormat = workbook.CreateDataFormat();
                ICellStyle dateStyle = workbook.CreateCellStyle();
                dateStyle.DataFormat = dateFormat.GetFormat("yyyy/m/d" + (dateWithTime ? " h:mm;@" : string.Empty));
                IDataFormat decimalFormat1 = workbook.CreateDataFormat();
                ICellStyle decimalStyle1 = workbook.CreateCellStyle();
                decimalStyle1.DataFormat = decimalFormat1.GetFormat("#0.0");
                IDataFormat decimalFormat2 = workbook.CreateDataFormat();
                ICellStyle decimalStyle2 = workbook.CreateCellStyle();
                decimalStyle2.DataFormat = decimalFormat2.GetFormat("#,##0.00");
                ms = new MemoryStream();
                sheet = workbook.CreateSheet(sheetName);
                headerRow = (XSSFRow)sheet.CreateRow(0);
                foreach (DataColumn column in SourceTable.Columns)
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                int rowIndex = 1;
                foreach (DataRow row in SourceTable.Rows)
                {
                    XSSFRow dataRow = (XSSFRow)sheet.CreateRow(rowIndex);
                    foreach (DataColumn column in SourceTable.Columns)
                    {
                        if (row[column] is int)
                            dataRow.CreateCell(column.Ordinal).SetCellValue((int)row[column]);
                        else if (row[column] is decimal)
                        {
                            ICell cell = dataRow.CreateCell(column.Ordinal);
                            cell.SetCellValue((double)(decimal)row[column]);
                            cell.CellStyle = column.Ordinal == 10 ? decimalStyle2 : decimalStyle1;
                        }
                        else if (row[column] is float)
                        {
                            ICell cell = dataRow.CreateCell(column.Ordinal);
                            cell.SetCellValue((double)(float)row[column]);
                        }
                        else if (row[column] is double)
                        {
                            ICell cell = dataRow.CreateCell(column.Ordinal);
                            cell.SetCellValue((double)row[column]);
                        }
                        else if (row[column] is DateTime)
                        {
                            ICell cell = dataRow.CreateCell(column.Ordinal);
                            cell.SetCellValue((DateTime)row[column]);
                            cell.CellStyle = dateStyle;
                        }
                        else
                            dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                    }
                    ++rowIndex;
                }
                //列宽自适应,只对英文和数字有效
                for (int i = 0; i <= SourceTable.Columns.Count; ++i)
                    sheet.AutoSizeColumn(i);
                workbook.Write(ms);
                ms.Flush();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                ms.Close();
                sheet = null;
                headerRow = null;
                workbook = null;
            }
            return ms;
        }

        private void ConvertToExcel(string xlsSaveFileName, DataTable SourceTable, string sheetName, bool dateWithTime = true)
        {
            FileStream fs = null;
            try
            {
                using (fs = new FileStream(xlsSaveFileName, FileMode.Create, FileAccess.Write))
                {
                    using (BinaryWriter bw = new BinaryWriter(fs))
                    {
                        MemoryStream ms = RenderDataTableToExcel(SourceTable, sheetName, dateWithTime) as MemoryStream;
                        bw.Write(ms.ToArray());
                        bw.Flush();
                        bw.Close();
                    }
                }
            }
            catch (System.Exception ex)
            {
                throw new System.Exception("转换数据到Excel失败:" + ex.Message);
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }

        private void SendEmail(string attachmentPath)
        {
            try
            {
                MailMessage message = new MailMessage();
                message.To.Add("[email protected]");
                message.Subject = "Export Sheet ‘" + DatabaseName + "‘ Done";
                message.From = new MailAddress("[email protected]");
                message.Body = "已执行时间: " + lblSpendTime.Text;
                message.Attachments.Add(new Attachment(attachmentPath));
                SmtpClient client = new SmtpClient("MailServer.company.com")
                {
                    EnableSsl = false
                };

                client.Send(message);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 查询数据库返回DataTable对象的方法
        /// </summary>
        /// <param name="sql">要执行的SQL语句</param>
        /// <param name="param">参数数组(可选)</param>
        /// <returns></returns>
        private DataTable GetDataTable(string sql, params SqlParameter[] param)
        {
            SqlConnection cn = null;
            SqlDataAdapter dapt = null;
            DataTable dt = new DataTable();
            try
            {
                cn = new SqlConnection(connectionString);
                dapt = new SqlDataAdapter(sql, cn);
                dapt.SelectCommand.CommandTimeout = CommandTimeout;

                if (param.Length > 0)
                {
                    foreach (SqlParameter p in param)
                    {
                        if (p != null)
                            dapt.SelectCommand.Parameters.Add(p);
                    }
                }
                dapt.Fill(dt);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dapt != null)
                    dapt.Dispose();
                if (cn != null)
                {
                    cn.Close();
                    cn.Dispose();
                }
            }
            return dt;
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
                cmbSqlFileList.Text = openFileDialog1.FileName;
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            foreach (string sqlFile in Directory.EnumerateFiles(Application.StartupPath, "*.sql"))
                cmbSqlFileList.Items.Add(sqlFile);
        }

        private void btnSaveExcelFile_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                txtSaveExcelFile.Text = saveFileDialog1.FileName;
        }

        private void btnResetFile_Click(object sender, EventArgs e)
        {
            txtSaveExcelFile.Text = Application.StartupPath + @"\" + DatabaseName + DateTime.Today.ToString("yyyyMMdd") + ".xlsx";
        }

        private void btnExportExcelSheet_Click(object sender, EventArgs e)
        {
            try
            {
                if (cmbSqlFileList.Text.Trim() == string.Empty)
                {
                    btnBrowse_Click(sender, e);
                    return;
                }
                else if (!File.Exists(cmbSqlFileList.Text.Trim()))
                {
                    MessageBox.Show("SQL查询文件不存在!");
                    btnBrowse_Click(sender, e);
                    return;
                }
                if (Int32.TryParse(txtConnectionTimeout.Text.Trim(), out CommandTimeout) && CommandTimeout > 0)
                {
                    btnRefresh.Enabled = false;
                    btnBrowse.Enabled = false;
                    btnSaveExcelFile.Enabled = false;
                    btnResetFile.Enabled = false;
                    btnExportExcelSheet.Enabled = false;
                    cmbSqlFileList.Enabled = false;
                    txtConnectionTimeout.ReadOnly = true;
                    dtSpending = new DateTime(1900, 1, 1, 0, 0, 0);
                    lblSpendTime.Text = dtSpending.Hour.ToString().PadLeft(2, ‘0‘) + ":" + dtSpending.ToString("mm:ss");
                    timer2.Enabled = true;
                    attachmentPath = txtSaveExcelFile.Text.Trim();
                    sqlContent = File.ReadAllText(cmbSqlFileList.Text.Trim());
                    exportExcelSheetWorker.RunWorkerAsync();
                }
                else
                    MessageBox.Show("估计执行时间必须为正整数!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void seachSqlFileWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            foreach (string sqlFile in Directory.EnumerateFiles(Application.StartupPath, "*.sql"))
                cmbSqlFileList.Items.Add(sqlFile);
        }

        private void seachSqlFileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnRefresh.Enabled = true;
        }

        private void exportExcelSheetWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            isBusy = true;
            ConvertToExcel(attachmentPath, GetDataTable(sqlContent), DatabaseName);
            SendEmail(attachmentPath);
        }

        private void exportExcelSheetWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            isBusy = false;
            if (chkAutoExit.Checked)
                Application.Exit();
            else
            {
                timer2.Enabled = false;
                btnExportExcelSheet.Enabled = true;
                btnBrowse.Enabled = true;
                btnSaveExcelFile.Enabled = true;
                btnResetFile.Enabled = true;
                btnRefresh.Enabled = true;
                cmbSqlFileList.Enabled = true;
                txtConnectionTimeout.ReadOnly = false;
            }
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Show();
                this.WindowState = FormWindowState.Normal;
                notifyIcon1.Visible = false;
                this.ShowInTaskbar = true;
            }
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            txtSaveExcelFile.Text = Application.StartupPath + @"\" + DatabaseName + DateTime.Today.ToString("yyyyMMdd") + ".xlsx";
            foreach (string sqlFile in Directory.EnumerateFiles(Application.StartupPath, "*.sql"))
                cmbSqlFileList.Items.Add(sqlFile);
            if (cmbSqlFileList.Items.Count > 0)
                cmbSqlFileList.SelectedIndex = 0;
        }

        private void frmMain_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized) //判断是否最小化
            {
                this.ShowInTaskbar = false; //不显示在系统任务栏
                notifyIcon1.Visible = true; //托盘图标可见
                if (isBusy)
                    notifyIcon1.ShowBalloonTip(1000);
                else
                    notifyIcon1.ShowBalloonTip(1000, notifyIcon1.BalloonTipTitle, "双击还原搜索工具!", notifyIcon1.BalloonTipIcon);
            }
        }

        private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
    }
}
时间: 2024-11-13 04:45:09

数据库查询自动导出发送工具的相关文章

数据库bcp导入导出批处理工具

应公司策划要求,需要一个数据库按表导入导出的工具配合svn来进行差异匹配,方便策划每天对数据库修改的记录工具,我使用bcp命令实现如下批处理工具,中间踩了不少坑,现保存在这边希望可以帮到需要此工具的同学. ::数据库地址 set ip=127.0.0.1 ::数据库帐号 set login=sa ::数据库密码 set passward=Passward ::数据库名称 set dataBase=MyDBName ::保存txt文件的路径 set filePath=d:\data::导入到数据库

数据库查询转excel小工具

因业务需求需要经常从数据库拉数据生成excel 每次都从数据库软件中操作贼烦 于是自己随便写了一个 有需要得拿去用吧 import psycopg2 import psycopg2.pool import xlsxwriter class Sql: ''' database:库名 user:用户名 password:密码 host:地址 port:端口 ''' def __init__(self,database,user,password,host,port): self.database=d

[转]Oracle10g数据库自动诊断监视工具(ADDM)使用指南

第一章 ADDM简介                 在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof.sql_trace.statspack.set event 10046&10053等等.这些工具能够帮助DBA很快的定位性能问题.但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行 优化.         那能不能由机器自动在统计数据的基础上给出优化建议呢?Oracle10g中就推出了新的优化诊断工具:数据库自动诊断监视工具(Automa

阿庆SQL智能查询分析器,使用delphi开发的一个数据库查询分析管理工具.分享给大家

为方便自己工作,使用delphi开发的一个数据库查询分析管理工具.分享给大家,具体以下特点: 1.由于使用ADO连接,理论支持SQL Server.Access.MySQL.Oracle等所有数据库 2.支持SQL关键词自动提示 3.支持表名自动提示 4.支持表字段自动提示 5.支持SQ关键词.表名.表字段不同颜色显示 6.支持SQL语句注释(包括ACCESS) 7.支持选择部分文字执行SQL语句 8.查询结果支持增加.修改.编辑 9.绿色程序无附加文件,只有一个文件即可运行,文件大小只有400

Oracle数据库批量数据导出工具开发

Oracle数据库批量数据导出工具开发 需求 最近工作中遇到一个需求,用户频繁要求从后台批量导出大量数据.目前的导出方式是使用PL/SQL Developer工具连接Oracle数据库,编写SQL语句,使用PL/SQL Developer工具自带的导出Excel文件的功能进行导出. 编写SQL查询结果 2.选择导出Excel文件 选择导出Excel文件时可以选择导出XLS.XLSX两种格式的文件. 遇到的问题:当用户要求导出的数据条数太大,超过XLS或者XLSX两种文件可以存储的最大行数时即导出

java 数据库查询工具类.

import java.util.List;import java.util.Map; /** * 数据库查询工具类. * */public class QueryTool {        /**     * Checks if is condition.     *     * @param obj the obj     * @return true, if is condition     */    public static boolean isCondition(Object ob

让MySoft.Data也能有Discuz!NT的数据库查询分析工具

当我们用Debug模式运行Discuz!NT项目的时候,我们会发现在页面的最下方有一个数据查询分析工具,非常的方便.当我们运行一个页面的时候,对sql的操作可以一目了然.当然,有些还是无法显示在页面上的,比如多个跳转的时候,最终显示的就只有一个页面的sql.不过也挺方便了. 如图: 这个数据库查询分析工具,只有在Debug模式下才会显示,Release模式不会显示. 这样的做法有两个好处,一是方便调试,第二是每当发布站点的时候,一定是Release模式的,可以确保站点在运行效率上有保证(很多时候

自动生成对应数据库表的JPA代码工具

http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成 自动生成对应数据库表的JPA代码工具: 1.myEclipse 使用MyEclipse Persistence Tools; 2.eclipse 创建一个JPA Project工程后,右键工程选JPA Tools选项生成,有用到Data Source Explorer,参考http://blog.csdn.net/zheng20

MariaDb数据库管理系统学习(二)使用HeidiSQL数据库图形化界面管理工具

HeidiSQL 是一款用于简单化的 MySQL 服务器和数据库管理的图形化界面.该软件允许你浏览你的数据库,管理表,浏览和编辑记录,管理用户权限等等.此外,你可以从文本文件导入数据,运行 SQL查询,在两个数据库之间同步表以及导出选择的表到其它数据库或者 SQL 脚本当中.HeidiSQL 提供了一个用于在数据库浏览之间切换 SQL 查询和标签带有语法突出显示的简单易用的界面.其它功能包括BLOB 和 MEMO 编辑,大型 SQL 脚本支持,用户进程管理等.该软件资源开放. MariaDB安装