FineUI 官方论坛

标题: EXCEL导入问题 [打印本页]

作者: 稀里哗啦    时间: 2014-8-15 11:19
标题: EXCEL导入问题
EXCEL 模板:
姓名       学号        科目      成绩    日期
张三   2000001     数学       80       2014-07-01
数据库后台:
学号            科目编码        成绩     日期
2000001       002                80      2014-07-01

问题:
1、这样的导入该怎么处理(直接导入数据库,最后前台提示成功导入);
2、我想先把Excel读取到前台的grid里显示,再批量保存到数据库,该怎么处理;


作者: sanshi    时间: 2014-8-15 12:04
首先你要借助第三方工具,来读取Excel文件
作者: Mr.Wu    时间: 2014-8-15 12:14
一直想要一个这样的demo,建议老大加一个到在线示例供大家参考,谢谢了
作者: 稀里哗啦    时间: 2014-8-15 12:53
sanshi 发表于 2014-8-15 12:04
首先你要借助第三方工具,来读取Excel文件

大神  是NPOI这样的第三方的吗
作者: 啃O    时间: 2014-8-15 14:47
以前处理过,流程是这样 把Excel问题通过导入形式存到服务器上,然后读取成 datatable 并用grid显示处理,然后再把datatable保存到数据库
作者: leetle    时间: 2014-8-15 14:56
需要的话找我,发你一个DEMO
作者: 稀里哗啦    时间: 2014-8-15 21:47
leetle 发表于 2014-8-15 14:56
需要的话找我,发你一个DEMO

求demo 邮箱:2282059928@qq.com
作者: 稀里哗啦    时间: 2014-8-15 21:48
啃O 发表于 2014-8-15 14:47
以前处理过,流程是这样 把Excel问题通过导入形式存到服务器上,然后读取成 datatable 并用grid显示处理, ...

你的意思先把excel上传到服务器再在服务器上处理吗
作者: 甘桂    时间: 2014-8-18 17:22
1通过FINIUI上传控件传到服务器上.记录上传的物理路径
2通过下面读到DATATABLE中
protected DataTable InputExcel(string Path)
         {
             try
             {
                 string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";//=Microsoft.Jet.OLEDB.12.0
                 OleDbConnection conn = new OleDbConnection(strConn);
                 conn.Open();
                 OleDbDataAdapter myCommand = null;

                 string strExcel = "select * from [Sheet1$]";
                 myCommand = new OleDbDataAdapter(strExcel, strConn);
                 DataTable dt = new DataTable();
                 myCommand.Fill(dt);
                 conn.Close();
                 return dt;
             }
             catch (Exception ex)
             {
                 throw new Exception(ex.Message);
             }
         }
3.再用DATATABEL的ROWS.COUNT判断条数内通这INSERT INTO表中.

如:FOR(I=0,I<DATATABLE.ROWS.COUNT,I++)
MODEL.NAME=DATABATLE.ROW[I][0].TOSTRING()
INSERTINTO TABEL
作者: 甘桂    时间: 2014-8-18 17:23
上面OLEDB12是OFFICE 2007及以后的格式.
作者: 甘桂    时间: 2014-8-18 17:24
读取时,可以真接对GRID进行数据绑定.就会达到你想要的.
作者: 甘桂    时间: 2014-8-18 17:26
不需要任何第三方控件.我的项目中就使用的.
作者: 稀里哗啦    时间: 2014-8-18 23:57
本帖最后由 稀里哗啦 于 2014-8-18 23:59 编辑
甘桂 发表于 2014-8-18 17:26
不需要任何第三方控件.我的项目中就使用的.

谢谢  我试试 求详细的样例程序
作者: 稀里哗啦    时间: 2014-8-21 14:22
甘桂 发表于 2014-8-18 17:22
1通过FINIUI上传控件传到服务器上.记录上传的物理路径
2通过下面读到DATATABLE中
protected DataTable Inp ...

导入已经没问题了,但是功能不够强大,想问个复杂的,如果我想导入一个excel,有100条数据,80条有效数据,表里已经有10条了,如何只导入后,提示只导入70条,然后导入失败的那部分再弄一个Excel出来,并标注失败的原因
作者: 甘桂    时间: 2014-8-22 11:52
表里有数据时为了不重复导入必须有一个字段进行单独判断。或者拿几个关键字段出来进行判断。如果数据存在就NEXT.
try
{                {
导入数据代码部分
K+=1
}
catch (Exception ex)
                 {
                     Alert.ShowInTop("发生异常,数据已回滚\n信息\n'" + ex.Message + "'");

                 }
                 finally
                 {
                     Alert.ShowInTop("成功处理" + k + "条数据!");
                     btnSavedata.Enabled = false;
                 }
             }
            
作者: 甘桂    时间: 2014-8-22 11:56
标注失败的数据那还得向上传的EXCEL文件写数据找出二个表中不同的数据,
作者: lqf20908    时间: 2014-8-25 18:46
#region 数据批量导入
        protected string SaveTempFiels(FineUI.FileUpload fuload)
        {
            string strFileName = fuload.FileName.ToString();
            string strFilePath = "";

            strFileName = strFileName.Replace(":", "_").Replace(" ", "_").Replace("\\", "_").Replace("/", "_");
            strFileName = "StudentBaseInfo_" + DateTime.Now.Ticks.ToString() + "_" + strFileName;
            strFilePath = "~/UpFiles/TempFiles/" + strFileName;

            strFilePath = Server.MapPath(strFilePath);
            fuload.SaveAs(strFilePath);
            //fuload.Reset();

            return @strFilePath;

        }

        protected DataTable ExcelToDataTable(string excelFilePath)
        {

            if (File.Exists(excelFilePath))
            {
                using (FileStream stream = File.OpenRead(excelFilePath))
                {

                    HSSFWorkbook workbook = new HSSFWorkbook(stream);
                    HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0);
                    DataTable table = new DataTable();
                    table.TableName = "导入信息";

                    HSSFRow headerRow = (HSSFRow)sheet.GetRow(0);
                    int cellCount = headerRow.LastCellNum;

                    for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                    {
                        if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
                        {
                            // 如果遇到第一个空列,则不再继续向后读取
                            cellCount = i + 1;
                            break;
                        }
                        DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                        table.Columns.Add(column);
                    }

                    for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                    {
                        HSSFRow row = (HSSFRow)sheet.GetRow(i);
                        if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
                        {
                            // 如果遇到第一个空行,则不再继续向后读取
                            break;
                        }

                        DataRow dataRow = table.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            dataRow[j] = row.GetCell(j);
                        }
                        table.Rows.Add(dataRow);
                    }

                    stream.Close();
                    workbook = null;
                    sheet = null;
                    return table;
                }
            }
            else
            {
                return null;
            }
        }

        protected DataSet ValidateUserTable(DataTable dt)
        {                                             
            // 如果除表头外有数据
            if (dt.Rows.Count > 0)
            {
                DataSet ds = new DataSet();
                bool isCorrect = false;
               
                string strDrValue = "";     ///  值
                string strFieldName = "";   ///  字段名
                string strMessage = "";     ///  错误信息
               
                string[] arrstrList = new string[] { "", "" };

                DataTable dtTable = new DataTable();   // 错误信息表
                dtTable.Columns.Add("错误行号", typeof(string));
                dtTable.Columns.Add("原数据", typeof(string));
                dtTable.Columns.Add("错误信息", typeof(string));

                #region 验证各列的值
                // 遍历行
                for (int i = 0; i < dt.Rows.Count; i++)  // i=0 为表头
                {
                    DataRow dr = dt.Rows[i];

                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        isCorrect = true;
                        strDrValue = dr[j].ToString().Trim();
                        strFieldName = dt.Columns[j].ToString().Trim();

                        #region 遍历列并进行验证
                        switch (j)
                        {...}



                   }

                }
                #endregion
               
                dt.TableName = "导入信息";
                ds.Tables.Add(dt);
                if (dtTable.Rows.Count>0)
                {
                    dtTable.TableName = "错误信息";
                    ds.Tables.Add(dtTable);
                }
                return ds;
            }
            else
            {
                return null;
            }
            
        }  
作者: Mr.Wu    时间: 2014-8-26 16:11
lqf20908 发表于 2014-8-25 18:46
#region 数据批量导入
        protected string SaveTempFiels(FineUI.FileUpload fuload)
        {

if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
                        {
                            // 如果遇到第一个空行,则不再继续向后读取
                            break;
                        }
请问一下:你这个是指某一个单元格是空的时候就不再往后读取吧?如果某个单元格允许空,其它单元格不空时,就会导致某行漏读取了哦。最好能判断整行为空时不再往下面读取
作者: lqf20908    时间: 2014-8-26 20:21
Mr.Wu 发表于 2014-8-26 16:11
if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
             ...

这个是根据我自己项目需要而进行的判断,你可以修改。
if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
某一行的第一列不为空,不是所有的列。
我的EXCEL需要保证第一列永远不为空,比如我的第一列就是”姓名“。


作者: 稀里哗啦    时间: 2014-8-27 07:48
lqf20908 发表于 2014-8-25 18:46
#region 数据批量导入
        protected string SaveTempFiels(FineUI.FileUpload fuload)
        {

我尝试一下,先说声谢谢,稍后来反馈




欢迎光临 FineUI 官方论坛 (https://fineui.com/BBS/) Powered by Discuz! X3.4