zoukankan      html  css  js  c++  java
  • asp.net NPOI导出xlsx格式文件,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

    NPOI导出xlsx格式文件,会出现如下情况:

    导出代码如下:

    /// <summary>
            ///     将datatable数据写入excel并下载
            /// </summary>
            /// <param name="dt">datatable </param>
            /// <param name="excelName">文件名</param>
            /// <param name="templatePath">模板路径</param>
            /// <returns></returns>
            public static void DataTableToExcelAndDownload(DataTable dt, string excelName, string templatePath)
            {
                IWorkbook workbook = null;
                FileStream fs = null;
                IRow row = null;
                ISheet sheet = null;
                ICell cell = null;
                ICellStyle cellStyle = null;
    
                try
                {
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        var rowCount = dt.Rows.Count; //行数
                        var columnCount = dt.Columns.Count; //列数
    
                        using (fs = File.OpenRead(templatePath))
                        {
                            //大批量数据导出的时候,需要注意这样的一个问题,Excel2003格式一个sheet只支持65536行,excel 2007 就比较多,是1048576
                            //workbook = new HSSFWorkbook(fs);//2003版本.xls
                            workbook = new XSSFWorkbook(fs); // 2007版本.xlsx
                        }
    
                        if (workbook != null)
                        {
                            sheet = workbook.GetSheetAt(0); //读取第一个sheet
    
                            //设置每行每列的单元格,
                            for (var i = 0; i < rowCount; i++)
                            {
                                row = sheet.CreateRow(i + 1);
                                for (var j = 0; j < columnCount; j++)
                                {
                                    cell = row.CreateCell(j);
                                    var value = dt.Rows[i][j];
                                    var bdType = value.GetType().ToString();
                                    switch (bdType)
                                    {
                                        case "System.String":
                                            cell.SetCellValue(value.ToString());
                                            break;
                                        case "System.DateTime": //日期类型 
                                            cell.SetCellValue(
                                                Convert.ToDateTime(value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
                                            break;
                                        case "System.Int16": //整型   
                                        case "System.Int32":
                                        case "System.Int64":
                                        case "System.Byte":
                                            var intV = 0;
                                            int.TryParse(value.ToString(), out intV);
                                            cell.SetCellValue(intV);
                                            break;
                                        case "System.Decimal": //浮点型   
                                        case "System.Double":
                                            double doubV = 0;
                                            double.TryParse(value.ToString(), out doubV);//格式化值
                                            cellStyle = workbook.CreateCellStyle();
                                            cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                                            cell.SetCellValue(doubV);
                                            cell.CellStyle = cellStyle;                                        
                                            break;
                                        default:
                                            cell.SetCellValue(value.ToString());
                                            break;
                                    }
                                }
                            }
    
                            var context = HttpContext.Current;
                            context.Response.Clear();
                            context.Response.ContentType = "application/vnd.ms-excel";
                            context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + excelName);
                            using (var ms = new MemoryStream())
                            {
                                workbook.Write(ms);
    
                                long fileSize = ms.Length;
                                //加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
                                context.Response.AddHeader("Content-Length", fileSize.ToString());
    
                                context.Response.BinaryWrite(ms.GetBuffer());
                                context.ApplicationInstance.CompleteRequest();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                    ExceptionHandling.ExceptionHandler.HandleException(ex);
                }
            }

    加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

    long fileSize = ms.Length;
    context.Response.AddHeader("Content-Length", fileSize.ToString());

    即可。

  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/qk2014/p/7729215.html
Copyright © 2011-2022 走看看