开发工具与关键技术:mvc
作者:黄志鹏
撰写时间:2019/5/1
下面我们来说说怎么在项目中把查询出来的表格导出到我们的Excel表格中。首先我们先要做的是要引用NPOI的插件。
这时引入插件后我们就写查询语句,查询出我们需要用到的所以数据。我们是根据我们需要导出的数据来写查询内容,这里我们需要用到很多字段,所以我们用的是连表查询。连表查询完了之后,我们是要构建实体类并赋值,在然后判断查询的数据要大于零和不等于空。
然后把我们查询出来的数据转化为对象列表的格式。之后我们就可以写导出表格的代码了。
这时我们可以做导出表格操作了,首先,我们用代码实现先创建一个工作薄。创建完工作薄之后我们再创建一个工作表并且给工作表中的Sheet命名。
代码如下:
这段代码就相当于我们在电脑桌面创建一个工作表,然后在工作表中的Sheet命名。
创建完之后我们就可以编写工作表了,我们的思路是先编写好表头的数据,然后我们就根据表头的数据内容依次从规定的行列中先后创建出行和单元格并赋值。
所以,我们在工作表中先创建一行,也就是我们在工作表的第一行中编写我们的表头。
下面是创建第一行的代码:
NPOI.SS.UserModel.IRow
row1 = sheet1.CreateRow(0);
这里的IRow是创建行的方法。sheet1.CreateRow(0),第一行它的下标是零,所以从零开始。
创建完第行之后,我们需要创建列数,列数是根据要导出来的数据内容来决定的,比如我们这里的数据只需要九列。
样式截图如下:
而行数则不同,行数则要根据我们要从项目中导出Excel表格的总数据的行数来决定。
在创建完第一行之后,我们就可以在第一行中编写我们所谓的表头了。所以,我们根据自己的表格数据内容来创建我们的行数。在这时,我们是已经知道工作表中的每一个单元格的位置坐标了。所以我们可以在工作表中对号入座的给每一个单元格赋值了。
相应代码如下
从上面的代码中我们可以看出。Row1是我们创建第一行时的命名,代码如下
NPOI.SS.UserModel.IRow
row1 = sheet1.CreateRow(0)
CreateCell(0)是第一列,(起始下标是0)。SetCellValue(“学号”)意思是赋值为学号,整行代码row1.CreateCell(0).SetCellValue(“学号”);的意思是在第一行的第一列的单元格赋值为“学号”。下面的这行代码row1.CreateCell(1).SetCellValue(“姓名”);则是在第一行的第二个单元格中给其赋值为“姓名”。下面第三行也是如此,以此类推,一直到第一行的第九个单元格完成赋值。
我们的表头就创建并且赋值完成,下面是表头的样式截图。
我们的表头完成之后,接下来就是要完成我们要导出来的数据了。由于可能数据太多我们就用一个for循环来遍历循环需要导出来的数据的总条数。所以我们就要根据需要导出来的数据的总条数来创建行。由于我在创建表头的时候已经规定了工作表只有九列,所以我们就在一到九列中便利循环一一赋值。所以我们先来在for循环中创建行,创建的行数已经由需要导出来的数据的总条数来决定。这里的起始行是在整个工作表里面的第二行开始的,因为工作表的第一行已经被之前的表头占领了。创建了行之后呢,我们就在这一行中去创建列,注意因为我们的表头只有九列数据,所以我们在这里也只能创建九列。接下来就是在这一行中给每一列赋值数据。这时需要注意的是赋值的顺序或位置,在这一行中我们是根据表头的内容来给我们的工作表的单元格赋值其相对应的数据,并不是无规则的给单元格赋值!
下面是其相对应代码:
rowTemp是行的名称CreateCell(0)是第一列,SetCellValue(listExaminee[i].StudentNumber)意思是赋值其查询出来的数据的实体类字段,listExaminee的意思是将查询出来的数据转化为对象列表的格式的名称。其原代码是:
List listExaminee =
listStu.ToList();
在行中给每一列赋值的方法便是如上代码所示,依次在一到九列中按表头规定的数据内容赋值。在for循环中我们把所有的数据给导出来了之后呢。
我们需要实现的一个操作是,为了实现工作薄的唯一化,所以我们要给工作薄一个唯一的名称来实现重命名操作。我们只需在工作薄的命名后面加上导出数据时当前的时间就可以做到让工作薄唯一化了。因为时间是可以不重复的。还有注意的一点是我们导出来的表格的格式是xls的格式。并不是xlsx的格式。
下面是在工作薄名称后面拼上当前时间的代码:
var
fileName = “考生信息” + DateTime.Now.ToString(“yyyy-MM-dd-HH-mm-ss-ffff”) + “.xls”;
现在我们需要实现的步骤是,我们现在表格还是存在于我们的内存流里面的。所以我们要借用IO流把文件读取出来。
所以现在我们要把表格转换成流的格式进行输出。我们先来创建文件流,下面是创建文件流的代码。
MemoryStream
bookStream = new MemoryStream();
现在我们可以进行将文件作为文件流的形式进行输出了,所以我们要将这个表格写在工作薄里面去,excelBook.Write(bookStream);
在我们输出的时候呢,我们还要调用文件流进行输出,而文件流的字节是很长的,所以我们调用Seek方法,于此来确定文件流的起始位置,Seek方法有两个参数,第一个是偏移量,第二个是游标的位置,bookStream.Seek(0, SeekOrigin.Begin);意思是在文件流中从零开始读取,读取出全部数据。
因为我们的表格它·是一个文件,所以我们要用文件的形式返回。文件返回有三个参数,第一个参数是具体的文件,第二个参数是文件的类型,第三个参数是文件的名称。
下面是文件返回的代码:
return File(bookStream, “application/vnd.ms-excel”, fileName);