精华内容
下载资源
问答
  • Excel导出几十万条数据

    千次阅读 2017-07-25 11:48:52
    workbookdata.SaveAs(filepath, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss); workbookdata.Close( false , miss, miss); appexcel....
    先上导出代码  
        /// <summary>  
                /// 导出速度最快  
                /// </summary>  
                /// <param name="list"><列名,数据></param>  
                /// <param name="filepath"></param>  
                /// <returns></returns>  
                public bool NewExport(List<DictionaryEntry> list, string filepath)  
                {  
                    bool bSuccess = true;  
                    Microsoft.Office.Interop.Excel.Application appexcel = new Microsoft.Office.Interop.Excel.Application();  
                    System.Reflection.Missing miss = System.Reflection.Missing.Value;  
                    appexcel = new Microsoft.Office.Interop.Excel.Application();  
                    Microsoft.Office.Interop.Excel.Workbook workbookdata = null;  
                    Microsoft.Office.Interop.Excel.Worksheet worksheetdata = null;  
                    Microsoft.Office.Interop.Excel.Range rangedata;  
          
                    workbookdata = appexcel.Workbooks.Add();  
          
                    //设置对象不可见  
                    appexcel.Visible = false;  
                    appexcel.DisplayAlerts = false;  
                    try  
                    {  
                        foreach (var lv in list)  
                        {  
                            var keys = lv.Key as List<string>;  
                            var values = lv.Value as List<IList<object>>;  
                            worksheetdata = (Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets.Add(miss, workbookdata.ActiveSheet);  
          
                            for (int i = 0; i < keys.Count-1; i++)  
                            {  
                                //给工作表赋名称  
                                worksheetdata.Name = keys[0];//列名的第一个数据位表名  
                                worksheetdata.Cells[1, i + 1] = keys[i+1];  
                            }  
          
                            //因为第一行已经写了表头,所以所有数据都应该从a2开始  
                            rangedata = worksheetdata.get_Range("a2", miss);  
                            Microsoft.Office.Interop.Excel.Range xlrang = null;  
          
                            //irowcount为实际行数,最大行  
                            int irowcount = values.Count;  
                            int iparstedrow = 0, icurrsize = 0;  
          
                            //ieachsize为每次写行的数值,可以自己设置  
                            int ieachsize = 10000;  
          
                            //icolumnaccount为实际列数,最大列数  
                            int icolumnaccount = keys.Count-1;  
          
                            //在内存中声明一个ieachsize×icolumnaccount的数组,ieachsize是每次最大存储的行数,icolumnaccount就是存储的实际列数  
                            object[,] objval = new object[ieachsize, icolumnaccount];  
                            icurrsize = ieachsize;  
          
                            while (iparstedrow < irowcount)  
                            {  
                                if ((irowcount - iparstedrow) < ieachsize)  
                                    icurrsize = irowcount - iparstedrow;  
          
                                //用for循环给数组赋值  
                                for (int i = 0; i < icurrsize; i++)  
                                {  
                                    for (int j = 0; j < icolumnaccount; j++)  
                                    {  
                                        var v = values[i + iparstedrow][j];  
                                        objval[i, j] = v != null ? v.ToString() : "";  
                                    }  
                                }  
                                string X = "A" + ((int)(iparstedrow + 2)).ToString();  
                                string col = "";  
                                if (icolumnaccount <= 26)  
                                {  
                                    col = ((char)('A' + icolumnaccount - 1)).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();  
                                }  
                                else  
                                {  
                                    col = ((char)('A' + (icolumnaccount / 26 - 1))).ToString() + ((char)('A' + (icolumnaccount % 26 - 1))).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();  
                                }  
                                xlrang = worksheetdata.get_Range(X, col);  
                                xlrang.NumberFormat = "@";  
                                // 调用range的value2属性,把内存中的值赋给excel  
                                xlrang.Value2 = objval;  
                                iparstedrow = iparstedrow + icurrsize;  
                            }  
                        }  
                        ((Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets["Sheet1"]).Delete();  
                        ((Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets["Sheet2"]).Delete();  
                        ((Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets["Sheet3"]).Delete();  
                        //保存工作表  
                        workbookdata.SaveAs(filepath, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);  
                        workbookdata.Close(false, miss, miss);  
                        appexcel.Workbooks.Close();  
                        appexcel.Quit();  
          
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbookdata);  
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(appexcel.Workbooks);  
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(appexcel);  
                        GC.Collect();  
                    }  
                    catch (Exception ex)  
                    {  
                        ErrorMsg = ex.Message;  
                        bSuccess = false;  
                    }  
                    finally  
                    {  
                        if (appexcel != null)  
                        {  
                            ExcelImportHelper.KillSpecialExcel(appexcel);  
                        }  
                    }  
                    return bSuccess;  
                }  
    
    
    
    
    range.NumberFormatLocal = "@";     //设置单元格格式为文本     
        
    range = (Range)worksheet.get_Range("A1", "E1");     //获取Excel多个单元格区域:本例做为Excel表头     
        
    range.Merge(0);     //单元格合并动作     
        
    worksheet.Cells[1, 1] = "Excel单元格赋值";     //Excel单元格赋值     
        
    range.Font.Size = 15;     //设置字体大小     
        
    range.Font.Underline=true;     //设置字体是否有下划线     
        
    range.Font.Name="黑体";       设置字体的种类     
        
    range.HorizontalAlignment=XlHAlign.xlHAlignCenter;     //设置字体在单元格内的对其方式     
        
    range.ColumnWidth=15;     //设置单元格的宽度     
        
    range.Cells.Interior.Color=System.Drawing.Color.FromArgb(255,204,153).ToArgb();     //设置单元格的背景色     
        
    range.Borders.LineStyle=1;     //设置单元格边框的粗细     
        
    range.BorderAround(XlLineStyle.xlContinuous,XlBorderWeight.xlThick,XlColorIndex.xlColorIndexAutomatic,System.Drawing.Color.Black.ToArgb());     //给单元格加边框     
        
    range.Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone; //设置单元格上边框为无边框     
        
    range.EntireColumn.AutoFit();     //自动调整列宽     
        
    Range.HorizontalAlignment= xlCenter;     // 文本水平居中方式     
        
    Range.VerticalAlignment= xlCenter     //文本垂直居中方式     
        
    Range.WrapText=true;     //文本自动换行     
        
    Range.Interior.ColorIndex=39;     //填充颜色为淡紫色     
        
    Range.Font.Color=clBlue;     //字体颜色     
        
    xlsApp.DisplayAlerts=false;   //对Excel的操作 不弹出提示信息  
    ApplicationClass xlsApp = new ApplicationClass(); // 1. 创建Excel应用程序对象的一个实例,相当于我们从开始菜单打开Excel应用程序。  
    if (xlsApp == null)  
    {  
    //对此实例进行验证,如果为null则表示运行此代码的机器可能未安装Excel  
    }  
      
    1. 打开现有的Excel文件  
      
    Workbook workbook = xlsApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
    Worksheet mySheet = workbook.Sheets[1] as Worksheet; //第一个sheet页  
    mySheet.Name = "testsheet"; //这里修改sheet名称  
      
      
    2.复制sheet页  
      
    mySheet.Copy(Type.Missing, workbook.Sheets[1]); //复制mySheet成一个新的sheet页,复制完后的名称是mySheet页名称后加一个(2),这里就是testsheet(2),复制完后,Worksheet的数量增加一个  
      
      
    注意 这里Copy方法的两个参数,指是的复制出来新的sheet页是在指定sheet页的前面还是后面,上面的例子就是指复制的sheet页在第一个sheet页的后面。  
    3.删除sheet页  
          
    xlsApp.DisplayAlerts = false; //如果想删除某个sheet页,首先要将此项设为fasle。  
    (xlsApp.ActiveWorkbook.Sheets[1] as Worksheet).Delete();  
      
      
    4.选中sheet页  
          
    (xlsApp.ActiveWorkbook.Sheets[1] as Worksheet).Select(Type.Missing); //选中某个sheet页  
      
      
    5.另存excel文件  
      
    workbook.Saved = true;  
    workbook.SaveCopyAs(filepath);  
      
      
    6.释放excel资源  
          
    workbook.Close(true, Type.Missing, Type.Missing);  
    workbook = null;  
    xlsApp.Quit();  
    xlsApp = null;  
      
    
    
    
    
    
    

    方法2:

     

     

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Office.Interop.Excel;
    using System.Data;
    
    namespace ExcelTest
    {
        public class ExcelUtil
        {
            System.Data.DataTable table11 = new System.Data.DataTable();
    
            public void ExportToExcel(System.Data.DataTable table, string saveFileName)
            {
    
                bool fileSaved = false;
    
                //ExcelApp xlApp = new ExcelApp();
    
                Application xlApp = new Application();
    
                if (xlApp == null)
                {
                    return;
                }
    
                Workbooks workbooks = xlApp.Workbooks;
                Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                Worksheet worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet1
    
                long rows = table.Rows.Count;
    
                /*下边注释的两行代码当数据行数超过行时,出现异常:异常来自HRESULT:0x800A03EC。因为:Excel 2003每个sheet只支持最大行数据
    
                //Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count+2, gridview.Columns.View.VisibleColumns.Count+1]);
    
                //fchR.Value2 = datas;*/
    
                if (rows > 65535)
                {
    
                    long pageRows = 60000;//定义每页显示的行数,行数必须小于
    
                    int scount = (int)(rows / pageRows);
    
                    if (scount * pageRows < table.Rows.Count)//当总行数不被pageRows整除时,经过四舍五入可能页数不准
                    {
                        scount = scount + 1;
                    }
    
                    for (int sc = 1; sc <= scount; sc++)
                    {
                        if (sc > 1)
                        {
    
                            object missing = System.Reflection.Missing.Value;
    
                            worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(
    
                           missing, missing, missing, missing);//添加一个sheet
    
                        }
    
                        else
                        {
                            worksheet = (Worksheet)workbook.Worksheets[sc];//取得sheet1
                        }
    
                        string[,] datas = new string[pageRows + 1, table.Columns.Count+ 1];
    
    for (int i = 0; i < table.Columns.Count; i++) //写入字段
                        {
                            datas[0, i] = table.Columns[i].Caption;
                        }
    
                        Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]);
                        range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Bold = true;
                        range.Font.Size = 9;
    
                        int init = int.Parse(((sc - 1) * pageRows).ToString());
                        int r = 0;
                        int index = 0;
                        int result;
    
                        if (pageRows * sc >= table.Rows.Count)
                        {
                            result = table.Rows.Count;
                        }
                        else
                        {
                            result = int.Parse((pageRows * sc).ToString());
                        }
                        for (r = init; r < result; r++)
                        {
                            index = index + 1;
                            for (int i = 0; i < table.Columns.Count; i++)
                            {
                                if (table.Columns[i].DataType == typeof(string) || table.Columns[i].DataType == typeof(Decimal) || table.Columns[i].DataType == typeof(DateTime))
                                {
                                    object obj = table.Rows[r][table.Columns[i].ColumnName];
                                    datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
    
                                }
    
                            }
                        }
    
                        Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 2, table.Columns.Count + 1]);
    
                        fchR.Value2 = datas;
                        worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
    
                        range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, table.Columns.Count]);
    
                        //15代表灰色
    
                        range.Font.Size = 9;
                        range.RowHeight = 14.25;
                        range.Borders.LineStyle = 1;
                        range.HorizontalAlignment = 1;
    
                    }
    
                }
    
                else
                {
    
                    string[,] datas = new string[table.Rows.Count + 2, table.Columns.Count + 1];
                    for (int i = 0; i < table.Columns.Count; i++) //写入字段         
                    {
                        datas[0, i] = table.Columns[i].Caption;
                    }
    
                    Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]);
                    range.Interior.ColorIndex = 15;//15代表灰色
                    range.Font.Bold = true;
                    range.Font.Size = 9;
    
                    int r = 0;
                    for (r = 0; r < table.Rows.Count; r++)
                    {
                        for (int i = 0; i < table.Columns.Count; i++)
                        {
                            if (table.Columns[i].DataType == typeof(string) || table.Columns[i].DataType == typeof(Decimal) || table.Columns[i].DataType == typeof(DateTime))
                            {
                                object obj = table.Rows[r][table.Columns[i].ColumnName];
                                datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
    
                            }
    
                        }
    
                        //System.Windows.Forms.Application.DoEvents();
    
    }
    
                    Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 2, table.Columns.Count + 1]);
    
                    fchR.Value2 = datas;
                    
                    worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
    
                    range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 1, table.Columns.Count]);
    
                    //15代表灰色
    
                    range.Font.Size = 9;
                    range.RowHeight = 14.25;
                    range.Borders.LineStyle = 1;
                    range.HorizontalAlignment = 1;
                }
    
                if (saveFileName != "")
                {
                    try
                    {
                        workbook.Saved = true;
                        workbook.SaveCopyAs(saveFileName);
                        fileSaved = true;
    
                    }
    
                    catch (Exception ex)
                    {
                        fileSaved = false;
                    }
    
                }
    
                else
                {
    
                    fileSaved = false;
    
                }
    
                xlApp.Quit();
    
                GC.Collect();//强行销毁 
        
            }
        }
    }
    复制代码

     

     

    方法3:

     

    先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用。

    导出代码:

     
    复制代码
    NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
    NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("test_01");
    
    // 第一列
    NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
    row.CreateCell(0).SetCellValue("第一列第一行");
    
    // 第二列
    NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(1);
    row2.CreateCell(0).SetCellValue("第二列第一行");
    
    // ...
    
    // 写入到客户端  
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    book.Write(ms);
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
    Response.BinaryWrite(ms.ToArray());
    book = null;
    ms.Close();
    ms.Dispose();
    复制代码

    导入代码:

    复制代码
    HSSFWorkbook hssfworkbook;  
    #region  
    public DataTable ImportExcelFile(string filePath)  
    {  
        #region//初始化信息  
        try  
        {  
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
            {  
                hssfworkbook = new HSSFWorkbook(file);  
            }  
        }  
        catch (Exception e)  
        {  
            throw e;  
        }  
        #endregion  
      
        NPOI.SS.UserModel.Sheet sheet = hssfworkbook.GetSheetAt(0);  
        System.Collections.IEnumerator rows = sheet.GetRowEnumerator();  
        DataTable dt = new DataTable();  
        for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++)  
        {  
            dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());  
        }  
        while (rows.MoveNext())  
        {  
            HSSFRow row = (HSSFRow)rows.Current;  
            DataRow dr = dt.NewRow();  
            for (int i = 0; i < row.LastCellNum; i++)  
            {  
                NPOI.SS.UserModel.Cell cell = row.GetCell(i);  
                if (cell == null)  
                {  
                    dr[i] = null;  
                }  
                else  
                {  
                    dr[i] = cell.ToString();  
                }  
            }  
            dt.Rows.Add(dr);  
        }  
        return dt;  
    }  
    #endregion  
    复制代码

     

     

    用法:

    首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: 
    复制代码
    //建立空白工作簿
    IWorkbook workbook = new HSSFWorkbook();
    //在工作簿中:建立空白工作表
    ISheet sheet = workbook.CreateSheet();
    //在工作表中:建立行,参数为行号,从0计
    IRow row = sheet.CreateRow(0);
    //在行中:建立单元格,参数为列号,从0计
    ICell cell = row.CreateCell(0);
    //设置单元格内容
    cell.SetCellValue("实习鉴定表");
    复制代码
    设置单元格样式:设置单元格样式时需要注意,务必创建一个新的样式对象进行设置,否则会将工作表所有单元格的样式一同设置,它们应该共享的是一个样式对象:
     
    复制代码
    ICellStyle style = workbook.CreateCellStyle();
    //设置单元格的样式:水平对齐居中
    style.Alignment = HorizontalAlignment.CENTER;
    //新建一个字体样式对象
    IFont font = workbook.CreateFont();
    //设置字体加粗样式
    font.Boldweight = short.MaxValue;
    //使用SetFont方法将字体样式添加到单元格样式中 
    style.SetFont(font);
    //将新的样式赋给单元格
    cell.CellStyle = style;
    复制代码
    设置单元格宽高:
      设置单元格的高度实际是设置其所在行高,所以要在单元格所在行上设置行高,行高设置数值好像是像素点的1/20,所以*20以便达到设置效果;
      设置单元格的宽度实际上是设置其所在列宽,所以要在单元格所在列上设置(列的设置在工作表上),宽度数值好像是字符的1/256,所以*256以便达到设置效果。
     
    //设置单元格的高度
    row.Height = 30 * 20;
    //设置单元格的宽度
    sheet.SetColumnWidth(0, 30 * 256);

     

     
    合并单元格:合并单元格实际上是声明一个区域,该区域中的单元格将进行合并,合并后的内容与样式以该区域最左上角的单元格为准。 
    //设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域
    //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
    sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10));

     

    添加公式:使用Cell的CellFormula来设置公式,是一个字符串,公式前不需要加=号。
    //通过Cell的CellFormula向单元格中写入公式
    //注:直接写公式内容即可,不需要在最前加'='
    ICell cell2 = sheet.CreateRow(1).CreateCell(0);
    cell2.CellFormula = "HYPERLINK(\"测试图片.jpg\",\"测试图片.jpg\")";
     
    将工作簿写入文件查看效果:
    //将工作簿写入文件
    using (FileStream fs = new FileStream("生成效果.xls", FileMode.Create, FileAccess.Write))
    {
      workbook.Write(fs);
    }

     



    展开全文
  • 项目经理给了一个15万条excel数据让导入数据库用于测试。 然后我就直接用项目中的方法进行excel的导入,结果一秒钟才插入了两条。 经过一下午的百度以及和别人交流,从以下三个方面进行优化: 1.使用easyexcel代替...

    项目经理给了一个15万条的excel数据让导入数据库用于测试。
    然后我就直接用项目中的方法进行excel的导入,结果一秒钟才插入了两条。
    经过一下午的百度以及和别人交流,从以下三个方面进行优化:
    1.使用easyexcel代替poi,内存中可以存更多的数据,减少对excel的读取。
    2.使用jdbc中的批量插入,减少对数据库的操作。
    3.使用多线程,优化效率。
    以下为代码:

    import java.math.BigDecimal;
    
    import com.alibaba.excel.annotation.ExcelProperty;
    //创建数据对象,对象中的属性通过注释中的角标和excel中的列所对应
    public class PrtcpntInfo {
    	
    	@ExcelProperty(index = 1)
    	private String prtcpntName;
    	
    	@ExcelProperty(index = 2)
    	private String prtcpntType;
    	
    	@ExcelProperty(index = 3)
    	private String prtcpntCertType;
    	
    	@ExcelProperty(index = 4)
    	private String prtcpnCertNo;
    	
    	@ExcelProperty(index = 6)
    	private String orgBusiType;
    	
    	@ExcelProperty(index = 7)
    	private BigDecimal payAmt;
    	
    	@ExcelProperty(index = 8)
    	private BigDecimal rightAmt;
    	
    	@ExcelProperty(index = 13)
    	private String cmpnstGoodsAmt;
    	
    	public BigDecimal getRightAmt() {
    		return rightAmt;
    	}
    	public void setRightAmt(BigDecimal rightAmt) {
    		this.rightAmt = rightAmt;
    	}
    	
    	public String getOrgBusiType() {
    		return orgBusiType;
    	}
    	public void setOrgBusiType(String orgBusiType) {
    		this.orgBusiType = orgBusiType;
    	}
    	public String getCmpnstGoodsAmt() {
    		return cmpnstGoodsAmt;
    	}
    	public void setCmpnstGoodsAmt(String cmpnstGoodsAmt) {
    		this.cmpnstGoodsAmt = cmpnstGoodsAmt;
    	}
    	
    	public String getPrtcpntName() {
    		return prtcpntName;
    	}
    	public void setPrtcpntName(String prtcpntName) {
    		this.prtcpntName = prtcpntName;
    	}
    	public BigDecimal getPayAmt() {
    		return payAmt;
    	}
    	public void setPayAmt(BigDecimal payAmt) {
    		this.payAmt = payAmt;
    	}
    	
    	public String getPrtcpntType() {
    		return prtcpntType;
    	}
    	public void setPrtcpntType(String prtcpntType) {
    		this.prtcpntType = prtcpntType;
    	}
    	public String getPrtcpntCertType() {
    		return prtcpntCertType;
    	}
    	public void setPrtcpntCertType(String prtcpntCertType) {
    		this.prtcpntCertType = prtcpntCertType;
    	}
    	public String getPrtcpnCertNo() {
    		return prtcpnCertNo;
    	}
    	public void setPrtcpnCertNo(String prtcpnCertNo) {
    		this.prtcpnCertNo = prtcpnCertNo;
    	}
    	
    }
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    /*
    jdbc的批量操作方法
    */
    public class PiDao {
    	int i = 0;
    	static SimpleDateFormat sdfDate = new SimpleDateFormat("yyyyMMdd");
    	static SimpleDateFormat sdfTime = new SimpleDateFormat("HHmmss");
    	private static final Logger LOG = LoggerFactory.getLogger(PiDao.class);
    	
    	public void save(List<PrtcpntInfo> list) {
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		String sql = "insert into t_prtcpnt_info_bak(court_no,case_no,"
    				+ "prtcpnt_type,prtcpnt_cert_type,prtcpnt_cert_no,prtcpnt_name,"
    				+ "prtcpnt_nation,regist_type,regist_cert_type,regist_cert_no,"
    				+ "regist_cert_addr,regist_cert_period,regist_name,regist_nation,"
    				+ "regist_mb_no,login_passwd,proc_stat,doubt_type,pay_stat,right_amt,pay_amt,pay_fail_num,"
    				+ "record_gen_date,record_gen_time,cmpnst_goods_amt,tot_pay_amt,tot_pay_times,contract_acct_no)values(?,?,"
    				+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    		conn = getConnection();
    		try {
    			conn.setAutoCommit(false);
    			pstmt = conn.prepareStatement(sql);
    		} catch (SQLException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    		for (PrtcpntInfo prtcpntInfo : list) {
    
    			try {
    				pstmt.setString(1, "08712001");
    				pstmt.setString(2, "2020000001");
    				String prtcpntType = prtcpntInfo.getPrtcpntType();
    				if ("A".equals(prtcpntType)) {
    					prtcpntType = "1";
    				}else if("B".equals(prtcpntType)) {
    					prtcpntType = "2";
    				}else{
    					continue;
    				}
    				pstmt.setString(3, prtcpntType);
    				String prtcpntCertType = prtcpntInfo.getPrtcpntCertType();
    				if ("C".equals(prtcpntCertType)) {
    					prtcpntCertType = "1";
    				}else if ("D".equals(prtcpntCertType)) {
    					prtcpntCertType = "A";
    				}else {
    					continue;
    				}
    				pstmt.setString(4, prtcpntCertType);
    				if (prtcpntInfo.getPrtcpnCertNo() == null) {
    					continue;
    				}
    				pstmt.setString(5, prtcpntInfo.getPrtcpnCertNo());
    				pstmt.setString(6, prtcpntInfo.getPrtcpntName());
    				pstmt.setString(7, "china");
    				pstmt.setString(8, "1");
    				pstmt.setString(9, "1");
    				pstmt.setString(10, prtcpntInfo.getPrtcpnCertNo());
    				pstmt.setString(11, "country-province");
    				pstmt.setString(12, "20200601");
    				pstmt.setString(13, prtcpntInfo.getPrtcpntName());
    				pstmt.setString(14, "china");
    				pstmt.setString(15, "15877985325");
    				pstmt.setString(16, "888888");
    				pstmt.setString(17, "01");
    				pstmt.setString(18, "0");
    				pstmt.setString(19, "0");
    				pstmt.setBigDecimal(20, prtcpntInfo.getRightAmt());
    				pstmt.setBigDecimal(21, prtcpntInfo.getPayAmt());
    				pstmt.setString(22, "0");
    				pstmt.setString(23, sdfDate.format(new Date()));
    				pstmt.setString(24, sdfTime.format(new Date()));
    				pstmt.setString(25, prtcpntInfo.getCmpnstGoodsAmt());
    				pstmt.setString(26, "0");
    				pstmt.setString(27, "0");
    				pstmt.setString(28, "11" + prtcpntInfo.getPrtcpnCertNo());
    				pstmt.addBatch();
    				i++;
    				LOG.info("第{}条", i);
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		try {
    			pstmt.executeBatch();
    			System.out.println("-----thousand------");
    			conn.commit();
    			conn.close();
    			pstmt.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	public static Connection getConnection() {
    		Connection connection = null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			connection = DriverManager
    					.getConnection(
    							"jdbc:mysql://192.168.245.98:3306/user?characterEncoding=UTF-8",
    							"user", "user");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return connection;
    	}
    
    import java.util.List;
    import java.util.concurrent.CountDownLatch;
    //创建线程类通过CountDownLatch的方法判断线程是否执行完成
    public class ImportThread implements Runnable{
    
    	public ImportThread() {
    		
    	}
    	PiDao piDao;
    	private List<PrtcpntInfo> list;
    	private CountDownLatch end;
    	
    	public ImportThread(List<PrtcpntInfo> list, CountDownLatch begin, CountDownLatch end, PiDao piDao) {
    		this.list = list;
    		this.end = end;
    		this.piDao = piDao;
    	}
    	
    	public void run() {
    			System.out.println("Thread----------------");
    			//执行完让线程直接进入等待
    			piDao.save(list);
    			end.countDown();
    			//begin.await();
    	}
    
    }
    
    import java.util.List;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    public class ThreadOperation {
    	//通过该方法进行线程的调用
    	public static void readExcel(List<PrtcpntInfo> list) {
    		//一个线程处理4000条数据
    		int count = 4000;
    		//数据集合大小
    		//开启的线程数                                                                  
    		int runSize = 5; 
    				//(listSize / count) + 1;
    		//存放每个线程的执行数据
    		List<PrtcpntInfo> newlist = null;
    		 
    		//创建一个线程池,数量和开启线程的数据量一样
    		ThreadPoolExecutor executor = new ThreadPoolExecutor(
    				runSize,runSize,1,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(5),
    				new ThreadPoolExecutor.DiscardOldestPolicy());
    		CountDownLatch begin = new CountDownLatch(1);
    		CountDownLatch end = new CountDownLatch(runSize);
    		//循环创建线程
    		for (int i = 0; i < runSize; i++) {
    			//计算每个线程执行的数据
    			if ((i + 1) == runSize) {
    				int startIndex = (i * count);
    				int endIndex = list.size();
    				newlist = list.subList(startIndex, endIndex);
    			}else {
    				int startIndex = (i * count);
    				int endIndex = (i + 1) * count;
    				newlist = list.subList(startIndex, endIndex);
    			}
    			
    			//线程类
    			ImportThread mythead = new ImportThread(newlist,begin,end,new PiDao());
    			//这里执行线程的方式是调用线程池里的execute(mythead)方法
    			executor.execute(mythead);
    		}
    		//begin.countDown();
    		try {
    			end.await();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//执行完关闭线程池
    		executor.shutdown();
    	}
    	
    }
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.fastjson.JSON;
    
    public class PrtcpntInfoListener extends AnalysisEventListener<PrtcpntInfo>{
    	private static Logger LOG = LoggerFactory.getLogger(PrtcpntInfoListener.class);
        /**
         * 每隔20000条存储数据库,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 20000;
        List<PrtcpntInfo> list = new ArrayList<PrtcpntInfo>();
        /**
         * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        private PiDao piDao;
    
        public PrtcpntInfoListener() {
            // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        	piDao = new PiDao();
        }
    
        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         *
         * @param demoDAO
         */
        public PrtcpntInfoListener(PiDao piDao) {
            this.piDao = piDao;
        }
    
        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data
         *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
         * @param context
         */
        public void invoke(PrtcpntInfo data, AnalysisContext context) {
        	LOG.info("解析到一条数据:{}", JSON.toJSONString(data));
            list.add(data);
            // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
            if (list.size() >= BATCH_COUNT) {
            	ThreadOperation.readExcel(list);
                //saveData();
                // 存储完成清理 list
                list.clear();
            }
        }
    
        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            saveData();
            LOG.info("所有数据解析完成!");
        }
    
        /**
         * 加上存储数据库
         */
        private void saveData() {
        	LOG.info("{}条数据,开始存储数据库!", list.size());
        	System.out.println("-------------"+list.size());
            piDao.save(list);
            LOG.info("存储数据库成功!");
        }
    }
    
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.ExcelReader;
    import com.alibaba.excel.read.metadata.ReadSheet;
    
    public class ExcelRead {
    
    	/**
    	 * 最简单的读
    	 * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
    	 * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
    	 * <p>3. 直接读即可
    	 */
    	public static void main(String args[]) {
    		
    	    // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    	    // 写法1:
    	    //String fileName = "H://demo//demo.xlsx";
    	    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    	    //EasyExcel.read(fileName, PrtcpntInfo.class, new PrtcpntInfoListener()).sheet().doRead();
    
    	    // 写法2:
    	    String fileName = "H://demo//信息登记表-汇总-1.xlsx";
    	    ExcelReader excelReader = EasyExcel.read(fileName, PrtcpntInfo.class, new PrtcpntInfoListener()).build();
    	    ReadSheet readSheet = EasyExcel.readSheet(0).headRowNumber(2).
    	    		build();
    	    excelReader.read(readSheet);
    	    // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
    	    excelReader.finish();
    	}
    }
    

    总后通过主方法进行调用,15万条数据大概10分钟,由于当时用的是远程桌面,电脑性能比较低,实际应该会更快。

    展开全文
  • winform使用XtraReport导出Excel,大概十万条数据,提示文件过大,认为是内存溢出,一次把数据加载到内存导致能存不够 后来尝试把数据分开导出,代码如下 foreach (DataTable exportDt in tables) { ...
  • 通过sax将数十万条excel数据导入

    千次阅读 2017-07-15 17:12:20
    什么是SAX? SAX(simple API for XML)是一...java导入excel表格数据方法: java提供了对excel对象进行操作的api,即POI。POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 对于excel文件,其中 ...

    什么是SAX?

    SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。

     

    java导入excel表格数据方法:

    java提供了对excel对象进行操作的api,即POI。POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    对于excel文件,其中

    HSSF提供读写Microsoft Excel XLS格式档案的功能。

    XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

    当Excel数据量比较小的时候可以直接通过poi导入Excel。

    但是当数据量过大时,poi生成WorkBook过程中会直接造成超内存,这时候可以通过sax解析Excel的xml格式。

    sax是如何解析Excel的xml文件?

    首先将Excel文件后缀名改成.zip后,可以看到文件目录结构,

    打开目录:\xl\worksheets下的sheet1.xml

    .xml文件内容如下:

     

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
               xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
               xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
               xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:etc="http://www.wps.cn/officeDocument/2017/etCustomData">
        <sheetPr/>
        <dimension ref="A1:AL1"/>
        <sheetViews>
            <sheetView tabSelected="1" topLeftCell="S1" workbookViewId="0">
                <selection activeCell="AI17" sqref="AI17"/>
            </sheetView>
        </sheetViews>
        <sheetFormatPr defaultColWidth="9" defaultRowHeight="13.5"/>
        <sheetData>
            <row r="1" spans="1:38">
                <c r="A1" s="1" t="s">
                    <v>0</v>
                </c>
                <c r="B1" s="1" t="s">
                    <v>1</v>
                </c>
                <c r="C1" s="1" t="s">
                    <v>2</v>
                </c>
            </row>
        </sheetData>
        <pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.511805555555556" footer="0.511805555555556"/>
        <headerFooter/>
    </worksheet>

    <row>标签对应每一行数据;

    <c>标签对应每一格数据,r="A1"表示位置;

    <v>对应值

    xml文件是由一系列节点构成,如<sheetData></sheetData>是一组节点,sax就是通过分析这一系列节点完成解析。sax主要通过继承DefaultHandle类,重写其中的方法,如下几个重要的方法:

        public void startDocument () {  
            //开始解析文档  
        }  
      
        public void endDocument () {  
            //文档解析结束  
        }  
      
        public void startElement (String uri, String localName, String qName, Attributes attributes) {  
            //开始解析节点  如<>
        }  
          
        public void characters (char[] ch, int start, int length) {  
            //保存节点内容  在调用startElement 方法后会调用
        }  
          
        public void endElement (String uri, String localName, String qName) {  
            //结束解析节点  如遇到</>
        }

    sax解析excel文件代码如下:

    package demo.readExcel;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xssf.eventusermodel.XSSFReader;
    import org.apache.poi.xssf.model.SharedStringsTable;
    import org.apache.poi.xssf.usermodel.XSSFRichTextString;
    import org.xml.sax.Attributes;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.DefaultHandler;
    import org.xml.sax.helpers.XMLReaderFactory;
    
    public class ReadExcelUtils {
    	private int headCount = 1;
    	private List<String> head = new ArrayList<String>();
    	private List<List<String>> rowLists = new ArrayList<List<String>>();
    	public String excelPath;
    
    	public ReadExcelUtils(String excelPath) {
    		this.excelPath = excelPath;
    		try {
    			processSAXReadSheet();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (OpenXML4JException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    	}
    
    	// 返回表头信息
    	public List<String> getHead() {
    		return head;
    	}
    
    	// 返回数据
    	public List<List<String>> getList() {
    		return rowLists;
    	}
    
    	public void processSAXReadSheet() throws IOException, OpenXML4JException, SAXException {
    
    		OPCPackage pkg = OPCPackage.open(excelPath);
    		XSSFReader xssfReader = new XSSFReader(pkg);
    		SharedStringsTable sst = xssfReader.getSharedStringsTable();
    		XMLReader parser = fetchSheetParser(sst);
    
    		Iterator<InputStream> sheets = xssfReader.getSheetsData();
    		//循环读取sheets
    		while (sheets.hasNext()) {
    			InputStream sheet = sheets.next();
    			InputSource sheetSource = new InputSource(sheet);
    			parser.parse(sheetSource);
    			sheet.close();
    		}
    	}
    
    	private XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {
    		// 利用XMLReaderFactory工厂类,创建XMLReader对象。
    		// System.setProperty("org.xml.sax.driver", "org.apache.xerces.parsers.SAXParser");
    		XMLReader parser = XMLReaderFactory.createXMLReader();
    		// XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    		ContentHandler handler = new SheetHandler(sst);
    		parser.setContentHandler(handler);
    		return parser;
    	}
    
    	/**
    	 * SAX 解析excel
    	 */
    	private class SheetHandler extends DefaultHandler {
    		private SharedStringsTable sst;
    		private String cellContent;
    		private boolean isNewRow;
    		private boolean isString;
    		private int rowIndex = 0;
    		private List<String> rowContent = new ArrayList<String>();
    		// cell位置,如A8
    		private String preRef = null;
    		private String ref = null;
    		private String maxRef = null;
    
    		private SheetHandler(SharedStringsTable sst) {
    			this.sst = sst;
    		}
    
    		/*
    		 * cell为空的两种情况: 1. cell中原来有数据,把数据清空后,cell为空,xml为:<c r="B2" />
    		 * 
    		 * 2.cell原本就为空,xml为:不存在此节点 , 如下不存在<c r="B1"></c>节点 <c r="A1" s="1"
    		 * t="s"> <v>0</v> </c> <c r="C1" s="1" t="s"> <v>2</v> </c>
    		 */
    		public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
    			if (name.equals("row")) {
    				rowIndex++;
    				isNewRow = true;
    			}
    			// c : cell
    			else if (name.equals("c")) {
    				if (isNewRow == true) {
    					preRef = ""+(char)('A' - 1) + (rowLists.size() + 1);
    					//preRef = attributes.getValue("r");
    				} else {
    					preRef = ref;
    				}
    				ref = attributes.getValue("r");
    
    				String cellType = attributes.getValue("t");
    				if (cellType == null) {
    					isString = false;
    				} else {
    					isString = true;
    				}
    				// 清空cellContent
    				cellContent = "";
    			}
    
    		}
    
    		public void characters(char[] ch, int start, int length) throws SAXException {
    			cellContent += new String(ch, start, length);
    		}
    
    		public void endElement(String uri, String localName, String name) throws SAXException {
    			if (name.equals("row")) {
    				if (rowIndex == headCount) {
    					head = rowContent;
    					maxRef = ref;
    				} else if (rowIndex > headCount) {
    					if (rowContent != null) {
    						// 处理空单元格
    						while ((maxRef.charAt(0) - ref.charAt(0)) > 0) {
    							rowContent.add(null);
    							ref = (char) (ref.charAt(0) + 1) + ref.substring(1, ref.length());
    						}
    						rowLists.add(rowContent);
    					}
    				}
    				rowContent = null;
    			} else if (name.equals("c")) {
    				//新的row 
    				if (isNewRow == true) {
    					rowContent = new ArrayList<String>();
    					isNewRow = false;
    				}
    				
    				// 处理空单元格
    				while ((ref.charAt(0) - preRef.charAt(0)) > 1) {
    					rowContent.add(null);
    					preRef = (char) (preRef.charAt(0) + 1) + preRef.substring(1, preRef.length());
    				}
    				//cellContent为String
    				if (isString) {
    					int idx = Integer.parseInt(cellContent);
    					cellContent = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
    				} else {   ///cellContent为int
    					// cell为空的第一种情况
    					if (cellContent.equals("")) {
    						cellContent = null;
    					} else {
    
    					}
    				}
    				
    				rowContent.add(cellContent);
    			}
    
    		}
    	}
    }

    在整个过程中,我遇到了以下几个问题:

     

      第一:cell为空的两种情况: 1. cell中原来有数据,把数据清空后,cell为空,xml为:<c r="B2" />  
      2.cell原本就为空,xml为:不存在此节点 , 如下不存在<c r="B1"></c>节点 

     

    <c r="A1" s="1" t="s"> 
      <v>0</v>
    </c> 
    <c r="C1" s="1" t="s">
      <v>2</v> 
    </c>

     

     

    展开全文
  • 分析会后找dba拿取sql的时候,突然得知数据的数量级有几十万,心中一阵懵逼。 第一次尝试:抱着侥幸的心理,依旧使用之间poi导出的方式,果然坑就在那,饶是绕不过去的,报错了tomcat:java.lang.OutOfMemoryError: ...

        某天,在一次新的需求讨论中,用户提出想要通过页面导出数据到excel,由于之前有使用poi导出数据到excel,所有在当时同意了这个需求。分析会后找dba拿取sql的时候,突然得知数据的数量级有几十万,心中一阵懵逼。

        第一次尝试:抱着侥幸的心理,依旧使用之间poi导出的方式,果然坑就在那,饶是绕不过去的,报错了tomcat:java.lang.OutOfMemoryError: Java heap space,内存溢出。百度了一下说是list集合一次获取数十万条数据,放不下了。

        第二次尝试:既然一次去几十万取不出来,那我分开获取数据呗,通过和dba的沟通,成功的实现每次获取10000条数据。恩,再次进行尝试---------还是同样的错误。静下心来缓缓,吃颗糖压压惊。选择在查询数据库前,list取值中,取值完成后,分别输出系统剩余freememory,发现了在list取值的过程中,可使用缓存急遽的下降直到报错。

         第三次尝试:拿着问题去寻找答案,经过搜索资料,各种实验,最终得出,在使用完成集合时,要及时清楚集合的缓存,主动调用垃圾回收。并且选择使用SXSSFWorkbook,恩,数据顺利的导出到了excel。

    下面是下载链接:https://download.csdn.net/download/qqweede/10420893


        


    展开全文
  • \Excel::import($toolOrder, $item->origin_filepath); } } Ipmorts 类 namespace App\Imports; use App\Exports\exportsOrders; use App\Exports\pddGoods; use Illuminate\Support\Collection; use...
  • 1、用easypoi解析Excel时解析过程已经封装好,我们得到的直接是解析完成的list数据集合,但是当数据量较大,据我测试达到10000时就出现了内存溢出 java heap space。所以数据量过大时,用自己定义的poi进行边解析...
  • 比如像电商行业,每月有上百万订单发货数据需要与仓库的数据进行核对计算,涉及到数据计算,筛选,匹配等步骤,用excel表超级卡,并且经常卡死。 这时如果你会Python,几行代码就可以搞定。 这里需要两个...
  • CSV导入十万条数据到数据库

    千次阅读 2019-10-11 21:03:05
    但是如果Excel表格数据库多的话(比如一万条),就会导致内存溢出。加大PHP的使用内存空间,也不是根本的解决办法。所以我们需要将Excel保存成CSV文件,在利用fgetcsv()函数进行分页导入,就不会发生内存溢出的...
  • 1.plsql中的ODBC Imported和text imported,可以直接选择文件导入。具体导入操作细节不赘述。大数据量的导入时客户端加载半天,还容易卡死,效率不行...38万条数据大约14分钟完成导入。 3.用oracle客户端自带的sqll...
  • 电商行业,每月有上百万订单发货数据需要与仓库的数据进行核对计算,涉及到数据计算,筛选,匹配等步骤,用excel表超级卡,并且经常卡死。 这时如果你会Python,几行代码就可以搞定。 这里需要两个Python库,一...
  • 如果你还继续单独写SQL语句,估计写个几十条你就会有跳楼的冲动,其实有两种简单的方法: 1、将Excel数据整理好,通过SQL的导入功能直接导入到数据库中,但是要保证数据库的字段和Excel的字段一致;或者写脚本读...
  • 万条数据写入花费1分钟, 万条数据写入花费13多分钟,写入越来越慢,这是什么原因呢?单元格格式就设置了一个不自动换行和某一列设置下拉框。由于业务原因,必须要将所有数据写入一个sheet,求大神解答,非常...
  • 条数据插入数据库(多个Insert into) 在B后面的第一列中放入 =CONCATENATE("insert into bankInfo (code, name) values ('",A1,"','",B1,"');"),然后选中第一行下拉拖,拖到最后一...
  • 接上一篇关于自动生成费用表并添加附件发送的博客,个人认为还需优化的有一处: 当数据量大时,所耗时间相应增加,... 以下为生成模拟十万条记录的python代码,主要用numpy和pandas库。模拟数据保存到本地的新e...
  • 在开发的过程中要处理Excel文件,将其文档的内容按照一定的形式封住加密之后写入到Kafka中,但是Kafka那边一次性不能消费大量的数据,所以要将数据分批次写入。... // 装填100条数据 for (int i = 0; i < list....
  • 利用POI技术实现将Mysql数据库中的数据(十万条)导出到Excel表格 一、POI是什么? Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 二、实现步骤 1....
  • 我国汽车保有量近年来持续高速增长,二手车交易也正蓬勃发展,涌现出瓜子、优信、人人车,等大量二手车交易网站。 这次就通过在线抓取人人车发布的线上...分析展示:Excel、Tableau、Seaborn 抓取的数据信息如...
  • 不知道是什么原因,navcait里面的导入向导只能导入...然后我再用notepad++文件,打开这个csv文件,然后转为utf-8的编码格式,然后再保存,或者你直接将,那个csv里面的几十万条数据复制粘贴出来,转为txt文件。然后...
  • excel 简单制作数据透视表

    千次阅读 2018-08-23 11:09:52
    曾经需要统计一个三万条数据,分析这批数据,当时数据透视表用的不溜,导致浪费了很多时间,那几天简直就是天天加班啊,摔碗。后来发现,excel就是那么强大,你所需要的功能,都可以找到方法快速实现。 首先是...
  • Excel数据量导出

    2019-10-09 16:31:08
    之前用这个方式的导出,当数据量达到65535的时候i,便会报错,达到excel的最大限制,困扰了...用这种导出时能达到大数据量级别,并且在导出10万条数据时,本地导出仅仅用了不到五秒。 图中采用的是ms: 具体代...
  • 还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到Excel中的每个Cell中,若用户对...
  • 还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到Excel中的每个Cell中,若用户对...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

excel十万条数据