问题描述
我在一个文件操作类中,定义了成员变量FileStream类型的fs,在类初始化中对fs进行初始化赋值,但是发现构造函数完成之后,fs不可用了。类似代码如下:privateFileStreamfs=null;publicExcelHelper(stringfileName){this.fileName=fileName;disposed=false;fs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);if(fileName.IndexOf(".xlsx")>0)//2007版本workbook=newXSSFWorkbook();elseif(fileName.IndexOf(".xls")>0)//2003版本workbook=newHSSFWorkbook();}在构造函数完成之后,fs就变掉了,导致后面其他成员函数中使用fs出现问题,必须对fs重新初始化赋值才可用,求大神解释?
解决方案
解决方案二:
这里变掉是什么意思呢?其他代码位置有对fs进行过close或者null操作吗?
解决方案三:
privateFileStreamfs=null;改成privatestaticFileStreamfs=null;试试
解决方案四:
贴出来完整的代码,只看你贴的这堆代码,没办法分析问题。
解决方案五:
引用3楼lovelj2012的回复:
贴出来完整的代码,只看你贴的这堆代码,没办法分析问题。
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingNPOI.SS.UserModel;usingNPOI.HSSF.UserModel;usingNPOI.XSSF.UserModel;usingSystem.IO;usingSystem.Data;namespaceSystemHelper{publicpartialclassNPOIExcelHelper:IDisposable{privatestringfileName=null;privateIWorkbookworkbook=null;privateFileStreamfs=null;privatebooldisposed;publicNPOIExcelHelper(stringfileName){this.fileName=fileName;disposed=false;fs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);if(fileName.IndexOf(".xlsx")>0)workbook=newXSSFWorkbook(fs);elseif(fileName.IndexOf(".xls")>0)workbook=newHSSFWorkbook(fs);}///<summary>///往excel指定的sheet写入数据///</summary>///<paramname="data"></param>///<paramname="sheetName"></param>///<paramname="isColumnWritten"></param>///<returns></returns>publicintDataTableToExcel(DataTabledata,stringsheetName,boolisColumnWritten){intcount=0;ISheetsheet=this.getSheetByName(sheetName);if(sheet==null)return-1;try{//写入表头数据if(isColumnWritten==true){IRowrow=sheet.CreateRow(0);for(intj=0;j<data.Columns.Count;j++){row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);}count=1;}else{count=1;}for(inti=0;i<data.Rows.Count;i++){IRowrow=null;row=sheet.GetRow(count);if(row!=null){for(intj=1;j<data.Columns.Count;j++){row.GetCell(j-1).SetCellValue(data.Rows[i][j].ToString());}}else{row=sheet.CreateRow(count);for(intj=1;j<data.Columns.Count;j++){row.CreateCell(j-1).SetCellValue(data.Rows[i][j].ToString());}}count++;}workbook.Write(fs);returncount;}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);return-1;}}///<summary>///通过sheetName获取sheet对象///</summary>///<paramname="sheetName"></param>///<returns></returns>privateISheetgetSheetByName(stringsheetName){ISheetsheet=null;//获取sheet对象if(sheetName!=null){sheet=workbook.GetSheet(sheetName);}returnsheet;}///<summary>///获取所有sheetName///</summary>///<returns></returns>publicstring[]getAllSheetNames(){intcount=workbook.NumberOfSheets;string[]res=newstring[count];for(inti=0;i<count;i++){res[i]=workbook.GetSheetName(i);}returnres;}///<summary>///获取指定sheetName的数据///</summary>///<paramname="sheetName"></param>///<returns></returns>publicDataTablegetDataFromExcelByName(stringsheetName){ISheetsheet=this.getSheetByName(sheetName);if(sheet==null)returnnull;returnthis.getDataFromSheet(sheet);}///<summary>///获取指定sheetIdx的数据///</summary>///<paramname="sheetName"></param>///<returns></returns>publicDataTablegetDataFromExcelByIdx(intidx){if(idx<0||idx>=workbook.NumberOfSheets){Console.WriteLine("sheetidx超出范围");returnnull;}returnthis.getDataFromSheet(workbook.GetSheetAt(idx));}///<summary>///从sheet对象中获取数据///</summary>///<paramname="sheet"></param>///<returns></returns>privateDataTablegetDataFromSheet(ISheetsheet){DataTabledata=newDataTable();intstartRow=0;try{if(sheet!=null){//获取第一行表头数据IRowfirstRow=sheet.GetRow(0);intcellCount=firstRow.LastCellNum;for(inti=firstRow.FirstCellNum;i<cellCount;i++){ICellcell=firstRow.GetCell(i);if(cell!=null){stringcellValue=cell.StringCellValue;if(cellValue!=null){DataColumncolumn=newDataColumn(cellValue);data.Columns.Add(column);}}}startRow=sheet.FirstRowNum+1;//获取总行数introwCount=sheet.LastRowNum;for(inti=startRow;i<=rowCount;i++){IRowrow=sheet.GetRow(i);if(row==null)continue;//没有数据的行默认为nullDataRowdataRow=data.NewRow();for(intj=row.FirstCellNum;i<cellCount;j++){if(row.GetCell(j)!=null){dataRow[j]=row.GetCell(j).ToString();}}data.Rows.Add(dataRow);}}returndata;}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);returnnull;}}publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(booldisposing){if(!this.disposed){if(disposing){if(fs!=null)fs.Close();}fs=null;disposed=true;}}}}
解决方案六:
文件流一直开在那里这么玩不好