code: def xls(self, xls_or_url, source="default", verbose=None):
      verbose = self.verbose if verbose is None else verbose
      p = print if verbose else (lambda x: 1)
  
      # source is either undefined, a string, or a (partial) bindings object
      if (
          isinstance(source, str)
          and source not in self.source_to_mappings
      ):
          p("Unknown source type", source)
          raise Exception("Unknown nodexl source type %s" % str(source))
      bindings = (
          self.source_to_mappings[source]
          if isinstance(source, str)
          else source
      )
  
      p("Fetching...")
      xls = (
          pd.ExcelFile(xls_or_url)
          if isinstance(xls_or_url, str)
          else xls_or_url
      )
  
      p("Formatting edges")
      edges_df = self.xls_to_edges_df(
          xls, bindings["edges_df_transformer"]
      )
  
      p("Formatting nodes")
      nodes_df = self.xls_to_nodes_df(
          xls, bindings["nodes_df_transformer"]
      )
  
      p("Setting up bindings")
      g1 = self.plot_edges_df(edges_df, bindings["edge_bindings"])
      g2 = self.plot_graph_df(g1, nodes_df, bindings["node_bindings"])
  
      p(
          "Ready to upload and view! (%s nodes, %s edges, %s columns"
          % (
              len(nodes_df),
              len(edges_df),
              len(nodes_df.columns) + len(edges_df.columns),
          )
      )
  
      return g2
  
file_path: pygraphistry/graphistry/nodexlistry.py
imports: import pandas
label_desc: Use image node_id 10 for calling the NodeXLGraphistryBase obj's underlying member method code with example usage: obj.xls(xls_or_url, source, verbose) and returns: g2