如何从存储在SharePoint文档库中的Excel工作簿中获取值?

时间:2010-08-06 16:07:51

标签: sharepoint excel

我有一些当前存储在Excel工作簿中的数据。数据在Excel中是有意义的(因为它易于管理,易于扩展,进行计算等),但自动化过程需要一些数据,因此从这个角度来看,它将是如果它在数据库中则更方便。

为信息提供更多可见性,工作流程等。我正在考虑将其移至SharePoint。实际上将其转换为SharePoint表单将是乏味的&耗费时间,然后失去灵活性/便利性;相反,我只想将当前的Excel文件存储在SharePoint库中。

我的问题是:自动化流程如何从现在位于SharePoint库中的Excel工作簿中提取所需的值?这是Excel Services可以用于的东西吗?或者还有其他/更好的方法吗?即使可以做到,这是明智之举吗?

2 个答案:

答案 0 :(得分:2)

经历过类似的事情,我可以告诉你,从文档库中的Excel文件中获取值实际上并不是那么糟糕。我最终编写了一个自定义工作流操作(在SharePoint Designer工作流中使用),它从Excel文件中读取值以进行处理。我最终选择NPOI来处理所有Excel操作。

使用NPOI,您可以这样做:

// get the document in the document library
SPList myList = web.Lists[listGuid];
SPListItem myItem = myList.GetItemById(ListItem);
SPFile file = myItem.File;

using (Stream stream = file.OpenBinaryStream())
{
    HSSFWorkbook workbook = new HSSFWorkbook(stream);
    HSSFSheet sheet = workbook.GetSheet("Sheet1");
    CellReference c = new CellReference("A1");
    HSSFRow row = sheet.GetRow(c.Row);
    HSSFCell cell = row.GetCell(c.Col);
    string cellValue = cell.StringCellValue;

    // etc...
}

您也可以轻松地将其放入控制台应用程序中。

答案 1 :(得分:1)

是的,我正在尝试在工作簿中的多个工作表上提取一系列单元格。我能够在控制台应用程序中使用下面的一些代码,并在命令窗口中查看数据。现在我需要将数据转储到SQL表中,并且正在寻找一些如何实现这一点的示例,并确保我按照正确的编码路径进行操作。

以下是我正在使用的代码的快照。

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
        using (SPSite site = new SPSite(SPContext.Current.Site.Url))
        {
            using (SPWeb web = site.RootWeb)
            {
                SPList docList = web.Lists[__ListId];
                SPListItem docItem = docList.GetItemById(__ListItem);
                SPFile docFile = docItem.File;

                using (Stream stream = docFile.OpenBinaryStream())
                {
                    HSSFWorkbook wb = new HSSFWorkbook(stream);

                    //loop through each sheet in file, ignoring the first sheet
                    for (int i = 1; i < 0; i++)
                    {
                        NPOI.SS.UserModel.Name name = wb.GetNameAt(i);
                        String sheet = wb.GetSheetName(i);

                        NPOI.SS.UserModel.Name nameRange = wb.CreateName();
                        nameRange.NameName = ("DispatchCells");
                        //start at a specific area on the sheet
                        nameRange.RefersToFormula = (sheet + "!$A$11:$AZ$100");

                    }

                    wb.Write(stream);

                }

            }
        }
        return ActivityExecutionStatus.Closed;
    }