如何在R中使用文本框读取Excel

rqmkfv5c  于 2023-05-23  发布在  其他
关注(0)|答案(3)|浏览(127)

我有一个Excel文件,其中包含一个文本框内的一些数据。目标是读取该文件,因为它是与行号完好无损。我不想读文本框里的内容。当我使用readxlopenxlsx包读取文件时,所有带文本框的行都被跳过。
例如,在所附的图像中,当我读取文件时,dataframe仅包含第9至14行。excel中的第9行是dataframe中的第1行。是否有任何方法可以读取文件,使我的 Dataframe 也有14行。前8行是否包含任何值并不重要。

testEmptyRow1 <- openxlsx::read.xlsx(filtered_list[1], skipEmptyRows=FALSE)# not working

编辑1-link to a smaple file

R将文件读取为-

编辑2我不想从文本框中读取内容。我们的目标是在 Dataframe 中有相同数量的行。如果前8行是空的或具有空值,请参见所附图像,这无关紧要。

a7qyws3x

a7qyws3x1#

我已经能够使用以下函数从Excel文本框中提取文本:

extract_Textbox_From_Excel <- function(dir, excel_File_Name)
{
  library(stringr)
  library(xml2)
  setwd(dir)
  file_Name_No_Ext <- str_replace(string = excel_File_Name, pattern = "\\.xlsx", replacement = "")
  file_Name_Zip <- paste0(file_Name_No_Ext, ".zip")
  dir.create(tmp <- tempfile())
  file.copy(from = paste0(dir, excel_File_Name), to = paste0(tmp, "\\", excel_File_Name))
  setwd(tmp)
  file.rename(from = excel_File_Name, to = file_Name_Zip)
  unzip(zipfile = file_Name_Zip)
  setwd(paste0(tmp, "\\xl\\drawings\\"))
  drawing_files <- list.files(pattern = "\\.xml")
  nb_Drawing_Files <- length(drawing_files)
  vector_Text <- character(nb_Drawing_Files)

  for(i in 1 : nb_Drawing_Files)
  {
    xml_Text <- read_xml(drawing_files[i])
    text <- xml_text(xml_Text, trim = TRUE)
    text <- str_replace_all(text, pattern = "\\d{12,200}", replacement = "")
    vector_Text[i] <- text
  }

  vector_Text <- vector_Text[str_detect(vector_Text, "[:alpha:]")]

  return(vector_Text)
}
a8jjtwal

a8jjtwal2#

Excel xlsx文件实际上是xml文件的压缩集合。我没有Excel,因为M@#$%^&S是混蛋,当我的一个硬盘驱动器在我的系统上崩溃时,不让我恢复安装,但当我将一个包含文本框的LibreOffice文件保存为Unix机器上的xlsx文件时,我可以解压缩它并看到以下内容:

drawing1.xml文件的内容在框中包含文本“This is a test”:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xdr:wsDr xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><xdr:twoCellAnchor editAs="absolute"><xdr:from><xdr:col>6</xdr:col><xdr:colOff>713880</xdr:colOff><xdr:row>9</xdr:row><xdr:rowOff>114840</xdr:rowOff></xdr:from><xdr:to><xdr:col>7</xdr:col><xdr:colOff>777240</xdr:colOff><xdr:row>11</xdr:row><xdr:rowOff>129600</xdr:rowOff></xdr:to><xdr:sp><xdr:nvSpPr><xdr:cNvPr id="0" name="TextShape 1"/><xdr:cNvSpPr txBox="1"/></xdr:nvSpPr><xdr:spPr><a:xfrm rot="1800000"><a:off x="5446440" y="1774080"/><a:ext cx="876240" cy="339840"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:noFill/></a:ln></xdr:spPr><xdr:txBody><a:bodyPr lIns="0" rIns="0" tIns="0" bIns="0"></a:bodyPr><a:p><a:r><a:rPr b="0" lang="en-US" sz="1200" spc="-1" strike="noStrike"><a:latin typeface="Times New Roman"/></a:rPr><a:t>This is a test</a:t></a:r><a:endParaRPr b="0" lang="en-US" sz="1200" spc="-1" strike="noStrike"><a:latin typeface="Times New Roman"/></a:endParaRPr></a:p></xdr:txBody></xdr:sp><xdr:clientData/></xdr:twoCellAnchor></xdr:wsDr>

我非常怀疑R包中是否有读取Excel文件的函数,这些函数旨在从此类文本框中提取文本内容。但是稍微搜索一下就会引出一个扩展的讨论,可能会给予你一些线索:
https://community.rstudio.com/t/best-r-package-to-create-textboxes-in-ms-excel/947/10
这里有几个链接,展示了如何在不同的语言中做到这一点,但有足够的细节来帮助聪明的用户:
How to read the text in textbox by using openpyxl
https://social.msdn.microsoft.com/Forums/office/en-US/874624c6-c923-4f2f-a60e-333bc9f24949/looking-for-code-to-update-a-textbox-on-a-spreadsheetml-doc-client-using-vbnet-but-i-can-read-and?forum=oxmlsdk

nimxete2

nimxete23#

下面是另一种可以考虑在第一个Excel工作表中提取文本框的方法:

library(RDCOMClient)
xlApp <- COMCreate("Excel.Application")
path_To_Excel_File <- "D:\\excel_File.xlsx"
xlWbk <- xlApp$Workbooks()$Open(path_To_Excel_File)
xlWbk$Worksheets(1)$Shapes(1)$TextFrame()$Characters()$Text()

相关问题