• 导入Excel 文件(图片和文字)NPOI+BootStrap fileinput 插件 的结合使用


    1.页面代码:

    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
    <link href="~/Content/fileinput.css" rel="stylesheet" />
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/fileinput.min.js"></script>
    <script src="~/Scripts/bootstrap.min.js"></script>
    <script src="~/Scripts/zh.js"></script>
    <script>
    $(function () {
    $("#input_1").fileinput({
    language: 'zh',
    previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
    showUpload: true, //是否显示上传按钮
    showCaption: false,//是否显示标题
    browseClass: "btn btn-primary", //按钮样式
    enctype: 'multipart/form-data',
    validateInitialCount: true,
    showUploadedThumbs: true
    });
    });
    </script>
    </head>
    <body>
    <div>
    @using (Html.BeginForm("Index1", "Test", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
    <input type="file" id="input_1" name="excle" class="file-loading" data-preview-file-type="text">
    <img src="@ViewBag.imagepath">
    }
    </div>
    </body>
    </html>

    在这里主要遇到过两个问题,

    第一个问题就是js的顺序问题,导致fileinput()初始化不成功。

    第二个问题是@using (Html.BeginForm("Index1", "Test", FormMethod.Post, new { enctype = "multipart/form-data" })) 

    在这句代码中没有加入new { enctype = "multipart/form-data" }导致后台HttpPostFileBase 为null;

    2.后台

    思路:

    1.首先通过HttpPostFileBase file=Request.Files["excle"];//excle为input 的name;

    2.通过File.SaveAS(path)把excle保存到本地文件夹中。

    3.如果是文字:

        通过封装好的ExcelHelp类的ExcelToDataTable方法,把Excel 转换为datatable;

      如果是图片;

    图片的话需要借助PictureInfo 类和NpoiExtend 类这两个类读取到List<PictureInfo> list 中。

    然后把通过System.Drawing.Image.Save()方法保存list.PictureData到相应的目录中!

    然后就ok啦。

    下面是后台图片的处理代码:

    file.SaveAs(savepath);
    DataTable dt = new DataTable();
    FileStream fs = new FileStream(savepath, FileMode.Open, FileAccess.Read);
    IWorkbook book = new XSSFWorkbook(fs);
    ISheet sheet = book.GetSheet(book.GetSheetName(0));
    List<PicturesInfo> list = new List<PicturesInfo>();
    list = NpoiExtend.GetAllPictureInfos(sheet);
    string dir = "/File/pictures/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/";
    string newfileName = Guid.NewGuid().ToString();
    int j = 0;

    list.ToList().ForEach(p =>
    {
    int i = 0;
    string imagename = (i++).ToString();
    string fulldir = dir + j.ToString() + "/" + imagename + ".jpg";
    Directory.CreateDirectory(Path.GetDirectoryName(Request.MapPath(fulldir)));
    Stream stream = new MemoryStream(p.PictureData);

    Image image = Image.FromStream(stream);
    ImageHelp imagehelp = new ImageHelp();
    Bitmap myBitmap = new Bitmap(image);
    ImageCodecInfo myImageCodecInfo = imagehelp.GetEncoderInfo("image/jpeg");
    Encoder myEncoder = Encoder.Quality;
    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 75L);
    EncoderParameters myEncoderParameters = new EncoderParameters(1);
    myEncoderParameters.Param[0] = myEncoderParameter;
    image.Save(Request.MapPath(fulldir), myImageCodecInfo, myEncoderParameters);
    j++;

    在这里还用到了保证图片质量的PictureHelp类。

    我一开始想用FileStream 类,直接保存byte[]类型的p.Picturedata字节流,但是经过无脑的百度和研究FileStream类,证明这不是可能的

    因为FileStream 类只能读取具体的文件,要么这种文件是除图片外的,因为其他可以使用FileMode.OpenOrCreate方法创建没有数据的文件,而图片总不可能创建没有字节流的图片的。

    所以经过一番瞎找,发现了一种已解决方法。因为Image.FromStream可以读取流。所以我就先把p.Picturedata转换成Stream,Stream stream = new MemoryStream(p.PictureData);然后通过Image.FromStream()这个方法转换成了Image类,接下来就可以通过Image.save(path);path注意一定要是服务器的虚拟地址;

    但是这样保存下来的图片质量不忍直视,然后,我就经过高质量图片保存类PictureHelp,换了下图片质量。最终图片就成功保存了。

    然后我就开始在网页上测试图片的质量了,下面是我的测试图:

    结果证明图片的质量有那么一点提高,但是不多。。。

  • 相关阅读:
    采用FPGA实现音频模数转换器
    serial-input, parallel-output (SIPO) chip : TPIC6595 , 74HC164 , 74HC4094 or 74HC595
    DLL Injection and Hooking
    实战DELPHI:远程线程插入(DLL注入)
    将DLL挂接到远程进程之中(远程注入)
    [转]远程注入DLL : 取得句柄的令牌 OpenProcessToken()
    向其他进程注入代码的三种方法
    将dll文件注入到其他进程中的一种新方法
    busdog is a filter driver for MS Windows (XP and above) to sniff USB traffic.
    The Eclipse runtime options
  • 原文地址:https://www.cnblogs.com/smalldragon-hyl/p/6184176.html
Copyright © 2020-2023  润新知