精华内容
下载资源
问答
  • // 得到Excel的行数 this.totalRows = sheet.getPhysicalNumberOfRows(); // 得到Excel的列数(前提是有行数) if (totalRows > 1 && sheet.getRow(0) != null) { this.totalCells = sheet.getRow(0)....
  • 现象如图 实现代码: 1主方法测试 public static void main(String[] args) throws FileNotFoundException, IOException {  if (args.length  System.out.println("请提供Excel文件名作为参数。");

    现象如图

    实现代码:

    1主方法测试

    public static void main(String[] args) throws FileNotFoundException, IOException {
            if (args.length < 1) {
                System.out.println("请提供Excel文件名作为参数。");
                System.exit(-1);
            }
            String fileName = args[0];
            FileInputStream fis = new FileInputStream(fileName);
            POIFSFileSystem fs = new POIFSFileSystem(fis);
            HSSFWorkbook wb = new HSSFWorkbook(fs);
            HSSFSheet sheet = wb.getSheetAt(0);
            HSSFSheet ns = MergeRows(sheet, 2, 0);
            wb.write(new FileOutputStream(fileName + "1.xls"));
        }


    2实现方法

    /**
         * @param sheet
         *            需要处理的ExcelSheet
         * @param startRow
         *            开始行
         * @param checkColumn
         *            进行合并行的依据列,即如果该行的值不为空则需要保留,如果为空则需要将内容合并至上端非空的行
         * @return
         */
        public static HSSFSheet MergeRows(HSSFSheet sheet, int startRow, int checkColumn) {
            ExcelReader excelReader = new ExcelReader();
            HSSFSheet newSheet = sheet.getWorkbook().createSheet(UUIDGenerator.getUUID());
            if (sheet.getLastRowNum() == 0 && sheet.getRow(0) == null || startRow < 0 || checkColumn < 0
                    || checkColumn > sheet.getPhysicalNumberOfRows()) {
                // 空表同样返回空表
                // 无效起始行
                // 无效判断列
                return newSheet;
            }
            {
                // 复制表头
                for (int i = 0; i < startRow && i < (sheet.getLastRowNum() + 1); i++) {
                    HSSFRow newRow = newSheet.createRow(i);
                    if (sheet.getRow(i) == null) {
                        continue;
                    }
                    Iterator<Cell> it = sheet.getRow(i).cellIterator();
                    while (it.hasNext()) {
                        Cell cell = (Cell) it.next();
                        if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                            // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                            continue;
                        }
                        String v = excelReader.getCellFormatValue((HSSFCell) cell);
                        if (v != null && v.length() > 0) {
                            // 非空单元格,复制至新的Sheet
                            newRow.createCell(cell.getColumnIndex()).setCellValue(v);
                        }
                    }
                }
            }

            {
                // 如果checkColumn的值不为空,则创建新的行,否则直接添加至最后一行
                HSSFRow rowNew = null;
                for (int i = startRow; i < sheet.getLastRowNum() + 1; i++) {
                    HSSFRow rowOrg = sheet.getRow(i);
                    HSSFCell checkCell = rowOrg.getCell(checkColumn);
                    String checkCellValue = excelReader.getCellFormatValue(checkCell);
                    if (!StringUtils.isHaveNullOrBlankTrim(checkCellValue)) {
                        if (newSheet.getRow(newSheet.getLastRowNum()) == null) {
                            rowNew = newSheet.createRow(newSheet.getLastRowNum());
                        } else {
                            rowNew = newSheet.createRow(newSheet.getLastRowNum() + 1);
                        }
                        // 复制本行的值
                        Iterator<Cell> it = rowOrg.cellIterator();
                        while (it.hasNext()) {
                            Cell cell = (Cell) it.next();
                            if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                                // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                                continue;
                            }
                            String v = excelReader.getCellFormatValue((HSSFCell) cell);
                            if (v != null && v.length() > 0) {
                                // 非空单元格,复制至新的Sheet
                                rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
                            }
                        }
                    } else {
                        // 关键列值为空,需要将本行数据合并至最后一行
                        if (rowNew != null) {
                            Iterator<Cell> it = rowOrg.cellIterator();
                            while (it.hasNext()) {
                                Cell cell = (Cell) it.next();
                                if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
                                    // 合并数据,并且开始行非当前行,忽略,继续下一个单元格
                                    continue;
                                }
                                String v = excelReader.getCellFormatValue((HSSFCell) cell);
                                if (v != null && v.length() > 0) {
                                    // 非空单元格,创建或追加至新的Sheet
                                    HSSFCell c = rowNew.getCell(cell.getColumnIndex());
                                    if (c == null) {
                                        rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
                                    } else {
                                        c.setCellValue(excelReader.getCellFormatValue(c) + v);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return newSheet;
        }


    笑图:



    展开全文
  • 最近自己在开发一个测试管理工具,其中需要实现Excel的导入功能,但程序在导入Excel时,部分数据丢失了,程序没有报任何异常,这就怪了! 于是在网上搜索其他人是否遇到类似的问题,发现该问题比较常见,解决的方法...

    最近自己在开发一个测试管理工具,其中需要实现Excel的导入功能,但程序在导入Excel时,部分数据丢失了,程序没有报任何异常,这就怪了!
    于是在网上搜索其他人是否遇到类似的问题,发现该问题比较常见,解决的方法也较多,最终自己也顺利的解决了该问题。
    问题原因:Excel中的部分数据列的格式是数值类型,部分是文本类型。当用OleBb读取Excel时,在Extended Properties中,如果没有配置IMEX=1的属性,微软的处理机制是将列转换为同一类型来读取的.例如在第一行使用的是文本格式,而第二行使用的是数值格式,就会出现数值列的值读取出来为空。
    问题的原因定位到了,其实解决方法也很简单,只需将属性增加配置”IMEX=1”即可。
    代码如下:

    string strConn;
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +     AimFile + ";Extended Properties='Excel 8.0;IMEX=1';";
    OleDbConnection conn = new OleDbConnection(strConn);
    //读取工作区“Sheet1”中的数据
    OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", strConn);
    DataSet myDataSet = new DataSet();
    myCommand.Fill(myDataSet);
    return myDataSet;//返回数据集
    展开全文
  • 在ASP.NET中经常会遇到Excel文件导入数据库的问题,遇到数据量比较大的时候,最好显示进度条。 进度条设计是参考网上牛人提供的代码,利用JS实现的,谢谢这个大牛了(忘记了当时记录下他的大名了,:()。具体思路...

    在ASP.NET中经常会遇到Excel文件导入数据库的问题,遇到数据量比较大的时候,最好显示进度条。

    进度条设计是参考网上某牛人提供的代码,利用JS实现的,谢谢这个大牛了(忘记了当时记录下他的大名了,:()。具体思路:首先将后台服务器上 ProgressBar.htm 页面内容(其中有html和js代码)完全读取出来,并write到前台。然后在数据导入前,添加js调用,如下:

    jsBlock = "<script>BeginTrans('开始处理...');</script>";

    Response.Write(jsBlock); Response.Flush();

    其次,在处理每条数据导入的过程中,添加如下js调用:

    System.Threading.Thread.Sleep(20);

    float cposf = 0; cposf = 100 * i / maxrows; int cpos = (int)cposf;

    jsBlock = "<script>SetPorgressBar('" + "第" + i.ToString() + "条','" + cpos.ToString() + "');</script>"; Response.Write(jsBlock); Response.Flush();

    *******************************************************

    以下是完整的实现过程......

    前台.aspx部分代码:

    <tr> <td align="center" style="height: 25px; width: 100px;">父分类</td> <td valign="middle" style="height: 25px"> <asp:TextBox ID="tbParent" runat="server" CssClass="textinput" Text="" Width="150px"></asp:TextBox> <asp:TextBox ID="tbParentId" runat="server" CssClass="textinput" Text=""Width="19px" ></asp:TextBox> <asp:Label ID="Label1" runat="server" Font-Bold="True" ForeColor="Red" Text="不能为空" Visible="False"></asp:Label></td> < /tr> < tr> <td align="center" style="height: 24px; width: 100px;"> Excel文件</td> <td style="height: 24px"> <asp:FileUpload ID="fuGlossaryXls" runat="server" /> <asp:Label ID="Label2" runat="server" Font-Bold="True" ForeColor="Red" Text="不能为空" Visible="False"></asp:Label></td> < /tr>

    ... ... ...

    <asp:Button ID="btnImport" runat="server" CssClass="mybotton" Text="导 入" Width="60px" OnClick="btnImport_Click" ></asp:Button>

    以下是在FileUpload控件中,选择了相应文件后点击“导入”.aspx.cs文件中响应事件。

    protected void btnImport_Click(object sender, EventArgs e) { string cparentname = this.tbParent.Text.Trim(); string cparentid = this.tbParentId.Text.Trim(); if (cparentname == "") { Label1.Visible = true; return; } else { Label1.Visible = false; }

    string cfilename = this.fuGlossaryXls.FileName; if (cfilename == "") { Label2.Visible = true; return; } else { Label2.Visible = false; }

    //首先将文件上传到服务器/// string tempfilename = Guid.NewGuid().ToString(); String filepath = System.Configuration.ConfigurationSettings.AppSettings["SaveFilePath"] + tempfilename + ".xls"; try { fuGlossaryXls.SaveAs(filepath); } catch (Exception ex) { //Response.Write("<script>alert('数据文件上传出错!')</script>"); Response.Write(ex.Message); return; } //文件上传到服务器

    //显示进度/ DateTime startTime = System.DateTime.Now; DateTime endTime = System.DateTime.Now;

    // 根据 ProgressBar.htm 显示进度条界面 string templateFileName = Path.Combine(Server.MapPath("."), "ProgressBar.htm"); StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("gb2312"));   string html = reader.ReadToEnd(); reader.Close(); Response.Write(html); Response.Flush(); System.Threading.Thread.Sleep(1000);

    string jsBlock; // 处理完成 jsBlock = "<script>BeginTrans('开始处理...');</script>"; Response.Write(jsBlock); Response.Flush();

    ///-------------------------------------------------- object missing = Missing.Value; DateTime beforeTime; DateTime afterTime;

    beforeTime = DateTime.Now; Excel.Application cexcelapp = new Excel.Application(); cexcelapp.Visible = false; afterTime = DateTime.Now;

    Excel.Workbook workBook = cexcelapp.Workbooks.Open(filepath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

    //得到WorkSheet对象 Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(1);

    int maxrows = 0; int maxcolumns = 0; maxrows = sheet.UsedRange.Rows.Count; maxcolumns = sheet.UsedRange.Columns.Count; ///--------------------------------------------------

    System.Threading.Thread.Sleep(200);

    bool err = false;

    // 根据处理任务处理情况更新进度条 for (int i = 1; i <= maxrows; i++) { ///-------------处理------------------------------------- Range curentCell = (Range)sheet.Cells[i, 1]; string cvalue = curentCell.Text.ToString().Trim(); if (cvalue != "") { //bool exist = CommFun.DataItemExistCheck("GLOSSARY", "NODE_NAME", cvalue); string cwherestr = " parent_id = '" + cparentid + "'"; bool exist = CommFun.DataItemExistCheck("GLOSSARY", "NODE_NAME", cvalue, cwherestr); if (!exist) { string newnodeid = Glossary.GetNewnodeId(cparentid); int subresult = Glossary.AddNode(newnodeid, cvalue, cparentid); if (subresult != 0) { jsBlock = "<script>EndTrans('数据写入错误。');</script>"; Response.Write(jsBlock); Response.Flush(); err = true; break; } } } ///----------------------------------------------------- System.Threading.Thread.Sleep(20);

    float cposf = 0; cposf = 100 * i / maxrows; int cpos = (int)cposf;

    jsBlock = "<script>SetPorgressBar('" + "第" + i.ToString() + "条','" + cpos.ToString() + "');</script>"; Response.Write(jsBlock); Response.Flush(); }

    if (!err) { // 处理完成 jsBlock = "<script>EndTrans('处理完成。');</script>"; Response.Write(jsBlock); Response.Flush(); } // 用时 endTime = DateTime.Now; jsBlock = "<script>SetTimeInfo('用时" + GetTimeSpan(startTime, endTime) + "');</script>"; Response.Write(jsBlock); Response.Flush(); //显示进度/

    try { workBook.Close(null, null, null); cexcelapp.Workbooks.Close(); cexcelapp.Application.Quit(); cexcelapp.Quit();

    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(cexcelapp);

    workBook = null; cexcelapp = null;

    GC.Collect(); } catch (Exception e1) { throw e1; } finally { Process[] myProcesses; DateTime startTime1; myProcesses = Process.GetProcessesByName("Excel");

    //得不到Excel进程ID,暂时只能判断进程启动时间 foreach (Process myProcess in myProcesses) { startTime1 = myProcess.StartTime;

    if (startTime1 > beforeTime && startTime < afterTime) { myProcess.Kill(); } } }

    System.IO.File.Delete(filepath); }

    ProgressBar.htm 文件内容如下:

    <html> < head> < title></title> < script language="javascript">

    //开始处理 function BeginTrans(msg) { WriteText("Msg1",msg); }

    //设置进度条进度 function SetPorgressBar(msg, pos) { ProgressBar.style.width= pos + "%"; WriteText("Msg1",msg + " 已完成" + pos + "%"); }

    //处理结束 function EndTrans(msg) { if(msg=="") WriteText("Msg1","完成。"); else WriteText("Msg1",msg); }

    //设置时间信息 function SetTimeInfo(msg) { WriteText("Msg2",msg); }

    // 更新文本显示信息 function WriteText(id, str) { var strTag = '<font face="Verdana, Arial, Helvetica" size="2" color="#ea9b02"><B>' + str + '</B></font>'; if (document.all) document.all[id].innerHTML = strTag; } < /script> < /head> < body> < table align="center" style="height:100%"> <tr style="height:45%"><td></td></tr> <tr> <td> <div id="Msg1" style="height:16px;"> <font face="Verdana, Arial, Helvetica" size="2" color="#ea9b02"><b>正在加载...</b></font></div> <div id="ProgressBarSide" style="width:300px; color:Silver;border-width:1px; border-style:Solid;"> <div id="ProgressBar" align="center" style="height:20px; width:0%; background-color:#316AC5;"></div> </div> <div id="Msg2" style="height:16px;"><font face="Verdana, Arial, Helvetica" size="2" color="#ea9b02"><b></b></font></div> </td> </tr> <tr style="height:50%"><td></td></tr> < /table> < /body> < /html>

    转载于:https://www.cnblogs.com/xffy1028/archive/2013/04/18/3028915.html

    展开全文
  • 导入Excel数据

    2019-05-05 14:51:50
    下面是我最近学习的对导入Excel数据的总结 //首先在视图层引入layui插件,加载&&初始化layui模块,初始化导入数据临时表 //这里是加载&&初始化layui模块 layui.use([‘layer’, ‘table’], ...

    下面是我最近学习的对导入Excel数据的总结
    //首先在视图层引入layui插件,加载&&初始化layui模块,初始化导入数据临时表
    //这里是加载&&初始化layui模块
    layui.use([‘layer’, ‘table’], function () {
    layer = layui.layer,
    layuiTable = layui.table;
    //这里是初始化导入数据临时表
    临时表 = layuiTable.render({
    elem: “#临时表id”,
    //下面信息的名称要和数据表的名称一致,相当于设置了临时表的表头,这里我就只写一个了
    cols: [[
    { type: ‘numbers’, title: ‘序号’ },//根据数据的条数给你排序
    { field: ‘对应的数据库里面的名字’, title: ‘表头名字’, align: ‘center’ },
    ……
    ]],
    page: {
    limit: 10,//每页显示数据的条数
    limits: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],//每页条数的选项
    },
    data: []
    });
    });
    //然后再接着写弹出导入Excel的模态框
    function 自定义点击事件名称() {
    //然后再重置清空表单
    $("#表单id “).resetForm();
    //这下面是禁用保存到数据库的按钮,因为你是先放到临时表,避免失误保存到数据库,最后一步才是保存到数据库
    $(”#保存到数据库的按钮ID “).prop(“disabled”, true);
    //清空临时表相当于刷新的效果,reload是表格数据重载,注意上面要声明tabStudentImport全局变量用来放临时表,就是模态框里面的表,弹出模态框的时候然你看一下你的Excel表格有哪些数据
    临时表id.reload({
    url: “”,//请求路径为空
    data: []//加上这个是因为路径为空,为了防止报错给了个空数据源
    });
    //这下面是点击背景时不关闭动态模态框,按下esc时不关闭动态模态框,只能点X才能关闭
    $(”#模态框id").modal({
    backdrop: false,
    keyboard: false
    });
    //弹出模态框
    KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲模态框id").modal("…("#选择文件的id").val() == “” || $("#选择文件的id “).val() == undefined) {
    return;
    }
    //这里是显示加载层
    var layIndex = layer.load();
    //然后这里是提交表单,ajaxSubmit()提交表单:我们直接通过form提交的话,提交后当前页面跳转到form的action所指向的页面。然而,很多时候我们并不希望提交表单后页面跳转,那么,我们就可以使用ajaxSubmit(obj)来提交数据,ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件
    $(”#表单id “).ajaxSubmit(function (Msg) {
    layer.close(layIndex);
    if (Msg.State) {
    //启用保存到数据库的按钮
    $(”#保存到数据库的按钮ID ").prop(“disabled”, false);
    //表格数据重载
    表格id.reload({
    url: “控制器写的提取Session中的数据、并进行分页操作的自定义方法名”
    });
    //执行成功时输出
    layer.alert(Msg.Text, { icon: 1, title: “提示” });
    }
    else{
    //清空table
    表格.reload({
    url: ‘’,
    data: []
    });
    //执行失败时输出
    layer.alert(Msg.Text, { icon: 0, title: “提示” });
    }
    });
    }
    //然后再接着道控制器写将导入的Excel表格的数据保存到session的方法
    // HttpPostedFileBase是数据类型
    public ActionResult form表单里面action名称(HttpPostedFileBase 参数)
    {
    ReturnJsonVo returnJson = new ReturnJsonVo();//记录状态
    try
    {//思路:首先第一步获取读取的文件;第二步把文件转换为二进制数组;第三步二进制数组转成内存流;第四步利用NPOI把内存流中的数据读取成Excel。
    NPOI就是在你没有安装office的时候可以读取Excel和word文档。
    要用NPOI就需要引用NPOI。引用方法如下:
    在这里插入图片描述
    右键点击引用,再点击添加引用
    在这里插入图片描述
    再点击浏览找到NPOI文件勾选上,然后确定就引用成功了。
    //把 “form表单里面action名称”从Session中移除避免残留以前数据
    Session.Remove(“form表单里面action名称”);
    //然后这里是判断页面传过来的文件是否为Excel表格,获取文件的后缀,后缀大写小写都可以,GetExtension是获取的方法,Equals是判断文件后缀和自定义名是否具有相同的值,否则提醒数据异常。
    string 自定义名 = System.IO.Path.GetExtension(file.文件名字);
    if (“文件后缀”.Equals(自定义名) || “文件后缀”.Equals(自定义名))
    {//这里写声明一个二进制数组来接收文件,这里new一个byte类型数组,后面的中括号是指定变量长度,它的长度就是文件内容的长度
    byte[]自定义二进制数组名 = new byte[file.ContentLength];
    //这里是将传入的文件转化为二进制的数组存入到上面声明的二进制数组里
    file.InputStream.Read(自定义二进制数组名, 0, file.ContentLength);
    //这里是创建一个内存流来保存二进制数组
    MemoryStream 自定义内存流名 = new MemoryStream(自定义二进制数组名);
    //这里是利用NPOI创建一个工作簿来保存内存流
    NPOI.SS.UserModel.IWorkbook 工作簿= new NPOI.HSSF.UserModel.HSSFWorkbook(自定义内存流名);
    //判断工作簿中是否有工作表,Sheet是数据表,大于零说明这个工作簿中就有工作表
    if (工作簿.NumberOfSheets > 0)
    {
    //查询出的信息:用来根据名称获取对应的ID
    List<数据库的表> 自定义字段1= (from 自定义字段2 in myModels. 数据库的表
    select 自定义字段2).ToList();
    ……
    //声明对象列表,存放导入的信息
    List<自定义封装类 > 自定义名= new List<自定义封装类>();
    //这里是利用NPOI获取第一个工作表,0是代表第一个
    NPOI.SS.UserModel.ISheet 工作表= 工作簿.GetSheetAt(0);
    //这里是判断它的物理行数是否大于0.如果大于0就说明有数据,PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。
    if (工作表.PhysicalNumberOfRows > 0)
    {
    // 将数据装到DataTable中
    DataTable 自定义表名 = new DataTable();
    //获取标题行,通过GetRow获取第一行
    NPOI.SS.UserModel.IRow 表头行 =工作表.GetRow(0);
    // LastCellNum表示获取某行的列数
    int 表格列数 = rowHeader.LastCellNum;
    // LastRowNum表示获取最后一个实际行的下标
    int 表格行数 = sheet.LastRowNum + 1;
    //这里通过一个for循环,创建dataTable中的列,循环添加标题行中各个单元格的数据,FirstCellNum表示获取某行第一个单元格下标。
    for (int i = rowHeader.FirstCellNum; i < 表格列数; i++)
    {
    //遍历表头行中每一个单元格,获取标题行各个单元格的数据,自定义名dtColumn,rowHeader.GetCell(i)是单元格,StringCellValue指的是它单元格的值
    DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
    //将上面获取到的标题行的数据放到dataTable中
    自定义表名.Columns.Add(dtColumn);
    }
    //读取Excel中的数据
    //这里for循环读取Excel中的数据,声明变量i,(sheet.FirstRowNum) 第一行是标题,FirstRowNum是获取第一个实际行的下标
    for (int i = sheet.FirstRowNum + 1; i < 表格行数; i++)
    {
    //这里利用NPOI再创建第二行,获取行数据,这里i等于1
    NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
    //创建DataTable行,创建的这个row
    DataRow 创建的行 = 自定义表名.NewRow();
    if (row != null)
    {
    //遍历循环excel中一行所有的单元格,声明变量j,这里的row等于我现在创建的第二行,FirstCellNum表示获取某行第一个单元格下标,row.FirstCellNum这个就表示第二行的第一个单元格下标
    for (int j = row.FirstCellNum; j < 表格列数; j++)
    {
    //从第一个单元格开始如果它不等于空
    if (row.GetCell(j) != null)
    { //从这一行里面获取到的单元格的值然后ToString转化成字符串
    创建的行[j] = row.GetCell(j).ToString();
    }
    }
    }
    //新行添加到dataTable中
    自定义表名.Rows.Add(创建的行);
    }
    int ImportSuccess = 0;//声明变量记录成功的条数
    int ImportFail = 0;//声明变量记录失败的条数
    // foreach遍历循环dataTable中的数据
    foreach (DataRow row in 自定义表名.Rows)
    {
    //创建自定义封装类保存每一条数据
    自定义封装类 自定义名 = new 自定义封装类();
    try
    {
    //获取ID和名称,通过dataTable中的名称到对应表中查找相应的ID,SingleOrDefault:返回序列中的唯一元素,如果该序列为空,则返回默认值,如果该序列包含多个元素则出发异常。 这里就只写一个示例
    自定义名.对应名称 = row[“名称”].ToString().Trim();
    自定义名.对应ID =对应表.Where(m => m.对应名称 == 自定义名. 对应名称).SingleOrDefault().对应ID;
    例:student.AcademeName = row[“学院”].ToString().Trim();
    student.AcademeID = dbAcademe.Where(m => m.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;
    //按照上面获取的依次写
    自定义名.对应的信息 = row[“名字”].ToString().Trim();
    例子: student.StudentName = row[“姓名”].ToString().Trim();
    //将每一条数据都添加到对象列表中
    对象列表的自定义名.Add(自定义名);
    ImportSuccess++;
    }
    catch (Exception)
    {判断语句}}
    //将数据保存到session中
    Session[“表”] = 对象列表的自定义名;
    判断语句}
    else
    {判断语句}}
    else
    {判断语句}}
    else
    {判断语句}}
    catch (Exception)
    {判断语句}
    return Json(returnJson, JsonRequestBehavior.AllowGet); }
    然后再接着写提取Session中的数据、并进行分页操作的方法
    public ActionResult 自定义方法名(LayuiTablePage layuiTablePage)
    // LayuiTablePage是layui table组件分页请求的数据封装,Page表示当前页码,limit表示每页的数据量,GetStartIndex表示分页开始序号,GetEndIndex表示分页结束序号,如图一所示
    在这里插入图片描述
    // LayuiTableData是自定义封装类,count表示总行数,data表示数据,如图二所示
    | 在这里插入图片描述

        {
            List<对象列表 > layuiTableData = new List<对象列表>();
            if (Session["表单"] != null)
            {//如果这个表的数据不等于空
                上面的自定义对象列表名 = Session["ImportExcel"] as List<对象列表 >;
            }
            //计算数据总条数
            int 数据总条数自定义名 = 上面的自定义对象列表名.Count(); 
            List<对象列表> 自定义数据名= 上面的自定义对象列表名
                                      //对对象列表进行降序排序
                                      .OrderByDescending(m => m.对应ID)
                                      .Skip(layuiTablePage.GetStartIndex())
                                      .Take(layuiTablePage.limit)
                                      .ToList();
            //实例化
          LayuiTableData<对象列表> layuiTableData = new LayuiTableData<对象列表>();
            layuiTableData.count = 数据总条数自定义名;
            layuiTableData.data = 自定义数据名;
            return Json(layuiTableData, JsonRequestBehavior.AllowGet);
        }
    

    然后再接着写保存导入的Excel表格数据到数据库的方法
    public ActionResult 自定义方法名()
    {
    string strMsg = “”;
    try
    {
    int successCount = 0;//记录保存成功的数据条数
    int oldCount = 0;//记录因于数据库已有数据重复而保存失败的数据条数
    //保存的数据从Session中拿
    List<对象列表 > 自定义名 = new List<对象列表 >();
    if (Session[“ImportExcel”] != null)
    {
    上面的自定义对象列表名 = Session[“ImportExcel”] as List<对象列表 >;
    }
    foreach (对象列表 局部变量 in 上面的自定义对象列表名)
    {
    在这里写判断数据是否与数据库中已有数据重复,和新增的写法是一样的,这里我就不写了,如果不会,就去看我前面的,有一篇写的新增数据的笔记
    //如果保存到数据库的大于一那么保存成功
    if (myModels.SaveChanges() > 0)
    {
    判断语句;
    catch (Exception)
    {判断语句}
    return Json(strMsg, JsonRequestBehavior.AllowGet); }
    最后在视图层写保存的点击事件
    function 控制器写的保存到数据库的自定义方法名()
    {
    var layIndex = layer.load();//打开加载层
    //请求保存导入的数据的url
    $.post(“控制器写的保存方法名”, function (Msg) {
    layer.close(layIndex); //关闭加载层
    $("#模态框id ").modal(“hide”);//关闭模态框
    layer.alert(Msg, { icon: 0, title: “提示” });//输出
    然后最后写刷新表格。这样就完成了导入Excel数据
    });
    }

    展开全文
  • Java导入Excel数据

    万次阅读 2018-09-10 11:27:48
    例如导入excel所在目录D:/cs/test.xls,测试数据如下图所示: 1.创建与excel表头对应的xml模版 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!-- 导入的模版校验...
  • 解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:setxlsconn=CreateObject("ADODB.Connection")xlsconn.Open"Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&...
  • 我做的项目中不同的成员写了一堆调查文档,sheet格式一致,我想把所有人的一个sheet全部导入到一个excel中去分析,显然手工copy不仅效率低,容易出错,文档随时都有可能变化,所以手工复制不是一个好办法,于是就想到用...
  • 使用poi导入时候,就是excel里面有空值的时候整个方法都会报错(指针异常),下面是我的助理方式:
  • 不能删除Excel某行数据时,提示: "该 ISAM 支持在链接表中删除数据"解决方法 C#2010-07-15 22:26:51阅读204评论0 字号:大中小 订阅原来Excel不支持删除,DELETE FROM sheet1$ 报错“该 ISAM 支持在链接...
  • 本文实现在c#中可高效的将excel数据导入到sqlserver数据库中,通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且...
  • Java导入导出Excel

    千次阅读 2017-12-03 19:09:30
    Java导入、导出Excel公共方法
  • 导入导出excel文件

    2017-03-08 23:26:55
    场景描述 将数据库表中的数据按照定义的EXCEL模板进行导出,下载到本地; 将EXCEL中的数据导入数据库相应的表中。 场景目标 通过本场景,解决EXCEL导入导出问题,供项目中...导入文件的内容数据格式如下,第一
  • java 导入导出 excel

    2019-09-29 01:39:27
    java 导入导出 excel 一、POI private ActionForward importExcel(ActionMapping mapping, LotStepEndTimeForm theform, HttpServletRequest request, HttpServletResponse respons...
  • 1、导入依赖: <!-- 文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version&...
  • excel导入导出

    2018-01-27 09:09:55
     * 导出Excel文件(导出“XLSX”格式,支持大数据量导出 @see org.apache.poi.ss.SpreadsheetVersion)  * @param  * @author l  */ public class ExportExcel {  private static Logger log = ...
  • [转]导入Excel遇到数字字母混合列,字母导入空值发生数据丢失时,用以下方法解决! 2012-12-25阅读310 评论0 使用Microsoft.Jet.OLEDB.4.0读取数据会出现当一字段内分别含有文本和数字的混合数据时,...
  • excel数据输出到txt文本中,再将txt文本导入到新的excel文件中 解决办法三: 数据本身出现问题,比如从网页上直接复制的数据有负号,可能和实际的负号不同,替换一下即可,如“—”替换“-” ...
  • java导入excel表格

    2011-06-18 16:31:03
    一个从网上下载的很好的excel操作资料!   1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语:...
  • 正常情况下把excel数据导入到后台,需要在前台先实现上传功能,把excel文件上传到后台路径path下,然后再去读取这个path下的文件~由于项目有了上传功能,我就没写,这里只是根据后台路径去读取excel文件!...
  • Java数据导入Excel

    千次阅读 2014-07-18 15:04:05
     //这里需要注意的是,在Excel中,第一个参数表示列,第二个表示   Label labelC = new Label(j, i, "这是第"+(i+1)+",第"+(j+1)+"列");   try {   //将生成的单元格添加到工作表中   ws....
  • 基于POI实现Excel表的导入导出功能

    万次阅读 多人点赞 2017-06-12 20:43:56
    对于Excel表的结构,简单理解可以把它分成三部分(Sheet,Cell,Row),这三部分可以理解为excel表中的页,列,。因此,我们想要获取到一个单元的内容,可以通过获取该单元所在的页数、对应所在的和对应的列数...
  • 导入Excel表格数据(一)

    千次阅读 2019-06-07 15:42:04
    开发工具与关键技术:VS+导入Excel表格 作者: 李伙 撰写时间: 2019年6月3日 在学习MVC过程中,如果我们需要录入条数据时可以利用新增的方法把我们的数据录入进去,而录入的数据比较多的时候,一条一条的录入会...
  • 表格导出为Excel 注意:演示所用到的软件Qt5.14.2,编译器MinGW 64-bit,电脑必须装有office 所用的类 QAxObject,QAxObject可以实例化为一个对象,使用它应该封装的COM对象的名称,或者使用一个指向表示...
  • 错误重现: ...在导入Excel读取数据时,其中的一个字段保存的值有如下格式:"2011072014","20110Aad10","25124Adfa","例子asdfadf" 这样的 混合了 "字母/数字/中文"数据,在Excel表格中的前 8条 或
  • * 上传Excel逾期催收数据 * * @param request * @return * @throws Exception */ @PostMapping("/uploadExcelCom") public Result uploadExcelCom(HttpServletRequest request) throws...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,116
精华内容 2,046
关键字:

导入excel显示某行不能为空