功能需求
获取上传的 EXCEL 文件的所有文本信息并存储到数据库里,可以进一步实现对文件内容资料关键字查询的全文检索。有助于我们定位相关文档,基本实现的步骤如下:
1、上传 EXCEL 文件,获取二进制数据并创建副本文件。
2、将EXCEL 副本文件通过 COM API 导出到指定的文本文件。
3、获取文本文件的内容字符串并存储到数据库中。
范例运行环境
操作系统: Windows Server 2019 DataCenter
操作系统上安装 Office Excel 2016
数据库:Microsoft SQL Server 2016
.net版本: .netFramework4.7.1 或以上
开发工具:VS2019 C#
关键代码
组件库引入
获取Excel文件的文本内容
getExcelContent 方法返回 string 类型内容,即表示EXCEL 文件的文本内容,说明如下表:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | _filename | string | 文件名为全路径文件信息,方法会根据文件路径创建_path System.Guid.NewGuid() ".txt" 的临时目标文件路径,导入EXCEL文件到 Excel Application ,使用 SAVEAS COM API 导出目标文本文件,再获文本文件内容,删除目标文本临时文件,将文件内容字符串返回。 |
实现代码如下:
代码语言:javascript复制public string getExcelContent(string _filename)
{
Object Nothing=System.Reflection.Missing.Value;
string _txtfile="",_path=Path.GetDirectoryName(_filename) "\",_ext="";
if(!Directory.Exists(_path))
{
Directory.CreateDirectory(_path);
}
_txtfile=_path System.Guid.NewGuid() ".txt";
object filename=_filename;
//创建一个名为ExcelApp的组件对象
DateTime beforetime=DateTime.Now;
Excel.Application excel=new Excel.Application();
excel.DisplayAlerts=false;
excel.AskToUpdateLinks=false;
excel.Visible=true;
DateTime aftertime=DateTime.Now;
Excel.Workbook xb=excel.Workbooks.Add(filename);
Worksheet worksheet = (Worksheet) excel.ActiveSheet;
sheetCount=excel.Sheets.Count;
worksheet.Activate();
worksheet.SaveAs(@_txtfile,XlFileFormat.xlUnicodeText, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
FileEx fe=new FileEx();
excel.Workbooks.Close();
string rv=fe.LoadFromFile(@_txtfile,Encoding.Unicode);
File.Delete(@_txtfile);
excel.Quit();
if(worksheet != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
}
if(xb != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xb);
xb = null;
}
if(excel != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
excel = null;
}
GC.Collect();
KillProcessByStartTime("EXCEL",beforetime,aftertime);
return rv;
}
public string KillProcessByStartTime(string processName,DateTime beforetime,DateTime aftertime)
{
Process[] ps = Process.GetProcesses();
foreach (Process p in ps)
{
if(p.ProcessName.ToUpper()!=processName) continue;
if(p.StartTime > beforetime && p.StartTime < aftertime)
{
try
{
p.Kill();
}
catch(Exception e)
{
return e.Message;
}
}
}
return "";
}
其中 KillProcessByStartTime 用于关闭未释放的EXCEL应用进程。
总结
以上代码我们提供了一些操作 EXCEL 的API关键方法,后续我们可以将文本内容存储到数据库中,查询或下载,可以参考我的文章:
《C# 将 Word 转文本存储到数据库并进行管理》
关于 EXCEL 文件导出方法可参考如下官方文档:
https://learn.microsoft.com/zh-cn/office/vba/api/excel.worksheet.saveas?redirectedfrom=MSDN
代码这里仅供大家参考,我们可以根据需求调整输出参数类型,欢迎大家评论指教!