热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化——导出大量数据

前言在开发人力资源项目的时候,一开始只是为了实现功能而实现功能,对于性能方面不是说没有考虑到,只能先保证一个系统稳定运行,然后后期进行优化。就这样一边开发,一边优化,进行的不亦
前言

    在开发人力资源项目的时候,一开始只是为了实现功能而实现功能,对于性能方面不是说没有考虑到,只能先保证一个系统稳定运行,然后后期进行优化。就这样一边开发,一边优化,进行的不亦乐乎···

内容

    前天由于项目中需要一下子导出大概上千条数据,清楚的记得米老师那天晚上验收的时候,心里很是惶恐,做的自以为傲的东西,就在导出数据这块,时间稍微有点长了,米老师指出,这块性能确实可以优化一下。想着想着,就开始行动了,就这样欢欢有一个方案,我也有一个,然后我们一起行动。下面介绍一些我的优化方案:

需求:

政府公司需要对本公司录入的表的数据进行加密导出到Excel中。(每个公司最多填写7张表)按最多的来,七张表大概是数据。

一开始是这样做的:

加密函数(伟大的攻坚小组的成果)

 

'*****************
    '定义一个加密函数*
    '*****************
    Public Function EncryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用的DES对称加密
        Try
            Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法
            'Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider'TripleDES算法
            Dim inputByteArray As Byte()
            'SourceStr = ""
            inputByteArray = System.Text.Encoding.Default.GetBytes(SourceStr)
            des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符
            des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符
            Dim ms As New System.IO.MemoryStream
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
            Dim sw As New System.IO.StreamWriter(cs)
            sw.Write(SourceStr)
            sw.Flush()
            cs.FlushFinalBlock()
            ms.Flush()
            EncryptDes = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
    End Function

D层调用Data表

    '返回data表的方法
    Public Function ReturnData() As DataTable
        Dim sql As String
        Dim table As DataTable

        sql = "select * from T_dataTable "
        table = helper.ExecSelect(sql, CommandType.Text)

        Return table
    End Function

B层获取D层值并且给D层传参

    '返回data表的方法
    Public Function ReturnData() As DataTable
        Dim simpleQuerydal As New DAL.SimpleQueryDAL
        Dim table As DataTable
        table = simpleQuerydal.ReturnData()
        Return table
    End Function

U层遍历DataGridView,将该表传给Excel


 '导出数据表
            tabledata = simplebll.ReturnData()
            DataData.DataSource = tabledata

            Dim MyExcel As New Microsoft.Office.Interop.Excel.Application() '定义并实例化excel工作表
            MyExcel.Application.Workbooks.Add(True) '打开excel工作簿,显示excel界面
            For Col = 0 To DataData.ColumnCount - 1     'col的变化范围
                MyExcel.Cells(1, Col + 1) = Me.DataData.Columns(Col).HeaderText   '添加标题
            Next Col
            Dim k As Integer    '定义整型行变量 i 
            Dim j As Integer    '定义整型列变量 j

            For k = 0 To DataData.RowCount - 2
                For j = 0 To DataData.ColumnCount - 1  '列变量取值范围

                    If Me.DataData(j, k).Value IsNot System.DBNull.Value Then
                        Dim EDes As String
                        EDes = EncryptDes(DataData(j, k).Value, "12345678", "abcdefgh")
                        MyExcel.Cells(k + 2, j + 1) = EDes
                    End If
                Next j
            Next k
            MyExcel.ActiveWorkbook.SaveAs(path + "\数据表" + _companyName & Format(Now, "yy-MM-dd") & ".xls", ReadOnlyRecommended:=False)

            MyExcel.Quit()
            picProcess.Visible = False
            MsgBox("导出到桌面成功!", , "提示")
        Catch ex As Exception

        End Try

数据量为 



导出所用时间:

240S

优化后的结果(其他层不变)

U层

    定义一个数组“Array”,将DataGridView值直接赋值给Excel。

'导出数据表
            tabledata = simplebll.ReturnData()
            DataData.DataSource = tabledata

            Dim MyExcel As New Microsoft.Office.Interop.Excel.Application() '定义并实例化excel工作表
            MyExcel.Application.Workbooks.Add(True) '打开excel工作簿,显示excel界面
            Dim arr3 As Array = Array.CreateInstance(GetType(String), DataData.RowCount, DataData.ColumnCount)
            For Col = 0 To DataData.ColumnCount - 1     'col的变化范围
                MyExcel.Cells(1, Col + 1) = Me.DataData.Columns(Col).HeaderText   '添加标题
            Next Col
            Dim k As Integer    '定义整型行变量 i 
            Dim j As Integer    '定义整型列变量 j

            For k = 0 To DataData.RowCount - 2
                For j = 0 To DataData.ColumnCount - 1
                    If IsDBNull(DataData.Rows(k).Cells(j).Value.ToString) Or IsNothing(DataData.Rows(k).Cells(j).Value.ToString) Then
                        datavalue3 = 0
                    Else
                        datavalue3 = DataData.Rows(k).Cells(j).Value.ToString
                    End If
                    arr3.SetValue(datavalue3, k, j)
                Next
            Next
            Dim EDes3 As String
            EDes3 = EncryptDes(arr3.GetValue(DataData.RowCount - 2, DataData.ColumnCount - 1), "12345678", "abcdefgh")
            Dim oRang3 As Microsoft.Office.Interop.Excel.Range
            oRang3 = MyExcel.Range(MyExcel.Cells(2, 1), MyExcel.Cells(DataData.RowCount, DataData.ColumnCount))
            oRang3.Value = EDes3
            MyExcel.ActiveWorkbook.SaveAs(path + "\数据表" + _companyName & Format(Now, "yy-MM-dd") & ".xls", ReadOnlyRecommended:=False)

            MyExcel.Quit()
            picProcess.Visible = False
            MsgBox("导出到桌面成功!", , "提示")

用时为:

    7S

    不知道为什么加密这里有点小问题(这个后期会再完善),但是在导出的数据量相等的情况下,还是用后者更适合需求 ,适合用户。马云说:客户第一。米老师说:客户第一。

小结

    1、不要相信你眼前的就是最好的,没有最好的,只有最好的。

    2、开始优化性能的道路···


感谢您的宝贵时间···


推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
秋忆道格
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有